不能将小数舍入到R中的两位小数

时间:2017-12-25 12:35:59

标签: r floating-point

我尝试过将小数舍入为两位数的不同函数,例如format()formatC()signif()round()。他们都不能真正将所有小数舍入到小数点后两位。

例如,我的数据框DF有三列:Index,PDF和CDF:

   Index          PDF          CDF
1  -1.00 8.306360e-07 8.306360e-09
2  -0.99 8.332774e-07 1.663913e-08
3  -0.98 8.411712e-07 2.505085e-08
4  -0.97 8.542267e-07 3.359311e-08
5  -0.96 8.722951e-07 4.231606e-08
6  -0.95 8.951719e-07 5.126778e-08
7  -0.94 9.226012e-07 6.049380e-08
8  -0.93 9.542808e-07 7.003660e-08
9  -0.92 9.898679e-07 7.993528e-08
10 -0.91 1.028986e-06 9.022514e-08
...
...
...

Index是一个向量,从-1.00到10.00。任何连续元素之间的差异为0.01。这意味着unique(diff(Index))应该只返回一个值,它必须是0.01。但是,unique(diff(Index))可以返回0.01。

我的目的是计算列CDF的任意两个元素之间的差异,并通过指示Index来选择这两个元素。例如,

a<-DF$CDF[DF$Index==(r+dr)];

b<-DF$CDF[DF$Index==(r-dr)];

res<-a-b;

r是任意数量的Indexdr可以是0.01,0.02或0.03。但是,由于Index的某些元素无法舍入为2位数(尽管它们看起来都是这样),因此我无法为任何r和dr计算res

我该如何解决这个问题?提前感谢您的建议!

1 个答案:

答案 0 :(得分:4)

在函数unique的某个点上,如果两个Index-Diffs相同,则函数必须进行测试,并且可能会使用==执行此操作。但是,将浮点值与==进行比较并不是一个好主意。使用您喜欢的搜索页面,其中&#34;浮点等于&#34;或者&#34;浮点比较&#34;或者在http://floating-point-gui.de/errors/comparison/阅读有关此问题的信息,您应该始终注意这一问题,不仅仅是针对此特定问题。

我在这种情况下的建议:将索引值乘以100,将它们转换为整数,==(从而unique)将与整数完美匹配。

修改

感谢@hrbrmstr的评论,我发现,您不仅需要as.integer,还需要round这些数字,如下面的代码所示

#wrong result due to floating point arithmetic
unique(diff(seq(-1,1,0.1)))

# multiple steps towards a working solution
seq(-1, 1, 0.1)
10*seq(-1, 1, 0.1)
as.integer(round(10*seq(-1, 1, 0.1)))
diff(as.integer(round(10*seq(-1, 1, 0.1))))
unique(diff(as.integer(round(10*seq(-1, 1, 0.1))))) # works!