代码之家  ›  专栏  ›  技术社区  ›  Anakin Skywalker

将1以下的所有可能数字舍入到0后的第一个小数点

  •  0
  • Anakin Skywalker  · 技术社区  · 7 年前

    我有很多不同的数字。从小到大。我想把他们都包围起来,却找不到合适的解决办法。

    通常人们把小数点四舍五入到一定的数字。简单地 round(x, 2) 或者别的什么。

    我的情况不同。

    例如,我有非常不同的数字。我最大的挑战是1以下有多个零的数字,因为我不希望它们四舍五入为零。

    x <- c(100.56, 100.132554444123, 10044400000.2523324, 
           1.2343454555424, 0.04454443, 0.0000000000000000000000543)
    
    lapply(x, signif)
    

    它给了我

    [[1]]
    [1] 100.56
    
    [[2]]
    [1] 100.133
    
    [[3]]
    [1] 10044400000
    
    [[4]]
    [1] 1.23435
    
    [[5]]
    [1] 0.0445444
    
    [[6]]
    [1] 0.0000000000000000000000543
    

    这几乎是我需要的。但我想用一些小数来限制1以下的数字。例如,将其四舍五入为最接近的有意义小数(第一个非零数)。

    我还尝试了其他一些选择,比如

    prettyNum(x)
    
    formatC(x)
    

    但他们不能解决我的问题。

    附笔。 对不起,有点混乱。 我想把小数字四舍五入到最接近的小数点(不确定我是否用正确的英语解释,对不起)。

    所以它应该是一个自定义函数。我将用某些小数(从0到3)对大数进行四舍五入。像这样的东西

    x <- c(100.56, 100.132554444123, 100444.2523324, 1.2343454555424, 0.04454443, 0.0000000000000000000000543)
    
    rounded_value <- function(value) {
    
    if (is.na(value)) return (NA)
    if (value >= 100) value <- round(value,2)
    if (value >= 1000) value <- round(value,0)
    if (value >= 1000000) value <- round(value,3)
    
    return (value)
    }
    
    
    lapply(x, rounded_value)
    
    [[1]]
    [1] 100.56
    
    [[2]]
    [1] 100.13
    
    [[3]]
    [1] 100444
    
    [[4]]
    [1] 1.234345
    
    [[5]]
    [1] 0.04454443
    
    [[6]]
    [1] 0.0000000000000000000000543
    

    我的问题是最后两个值-0.04454443,0.0000000000000000000000543。 我想单独将值舍入到1以下。例如,分为0.04和0.00000000000000006。试图找到一个函数来帮助我完成这个任务。

    更新。谢谢大家。我试图用更直观的方式重写这个函数。抱歉,如果我的第一个问题不完全是你在这里看到的。

    rounded_value <- function(value)
    {
    if (is.na(value)) return (NA)
    
    decimals <- 1
    value_out <- value
    while ( (value_out<-round(value,(decimals+1))) == 0 & decimals < 10) { 
    decimals <- decimals + 1 }
    
    if (value_out > 100) value_out <- round(value_out,1)
    if (value_out > 1000) value_out <- round(value_out,0)
    
    value_out <- as.numeric(value_out) 
    
    return (value_out)
    }
    

    更新3。我现在最好的猜测是

    x <- c(100.56, 100.132554444123, 100444.2523324, 1.2343454555424, 0.04454443, 
    0.00543)
    
    rounded_value <- function(value) {
    
    # if (is.na(value)) return (NA)
    if (value >= 100) value <- round(value,2)
    if (value >= 1000) value <- round(value,0)
    if (value >= 1000000) value <- round(value,3)
    while (value <= 1) value <- signif(x, 10)
    
    return (value)
    }
    
    rounded_value(x)
    

    它给了我

    [1]    100.56    100.13 100444.25      1.23      0.04      0.01
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   keithpjolley    7 年前

    不太清楚你在问什么。也许这会奏效-或者让你更亲近?

    R> x <- c(100.56, 100.132554444123, 10044400000.2523324, 
    +        1.2343454555424, 0.04454443, 0.0000000000000000000000543)
    R> ifelse(abs(x)>1, round(x), signif(x, digits=1))
    [1] 1.01000e+02 1.00000e+02 1.00444e+10 1.00000e+00 4.00000e-02 5.00000e-23