R计算的百分比不总计为一个精度问题

时间:2012-10-24 15:20:25

标签: r

我正在尝试处理R中的百分比,我遇到了奇怪的问题。当我将向量的值转换为向量的sum的百分比时,经常发生这种情况,它们不会加起来。

最小例子:

data <- rnorm(1000)*100
max <- 50
unlist(lapply(0:(1000/max-1), 
     function(i) 
        sum(
            data[(i*max+1):(i*(max+1))]
            /
            sum(data[(i*max+1):(i*(max+1))])
           )
        ))-1 

它应该给出零的向量,但是我得到了这个:

[1]  0.000000e+00  0.000000e+00 -1.110223e-16 -1.110223e-16  0.000000e+00 -1.110223e-16  0.000000e+00  0.000000e+00  0.000000e+00
[10]  0.000000e+00  0.000000e+00  2.220446e-16  0.000000e+00 -4.440892e-16  0.000000e+00  0.000000e+00  0.000000e+00  4.440892e-16
[19] -1.110223e-16  0.000000e+00

有任何补救措施吗?

2 个答案:

答案 0 :(得分:4)

他们被一个微不足道的数字所取代。如果要更改浮点运算中固有的这些无关紧要的差异的显示方式,可以使用格式函数或其中一个类似sprintf或formatC的表兄弟。这实际上是FAQ 7.31.的一个实例。如果您确实需要格式化方面的帮助,您应该描述一个特定的应用程序。如果你想强迫看到零,你也可以使用round()

round( unlist(lapply(0:(1000/max-1), 
 function(i) 
    sum(
        data[(i*max+1):(i*(max+1))]
        /
        sum(data[(i*max+1):(i*(max+1))])
       )
    ))-1  , digits=4)

答案 1 :(得分:4)

更重要的问题是为什么你认为这些应该是0

您正在使用浮点运算,并非所有数字都可以在您的计算机中准确表示。这涵盖(或与R FAQ 7.31相关,这解释了这种现象。

您可以忽略它(对于所有意图和目的,这些值都是0

> all.equal(tmp, rep(0, length(tmp))) ## tmp contain your numbers
[1] TRUE

或学会根据您的特定操作进行相应处理。一种方法是在某种程度上围绕它们:

> round(tmp, 2)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 3)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 4)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 5)
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

但这取决于你想对这些数字做什么。