我尝试过将小数舍入为两位数的不同函数,例如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
是任意数量的Index
,dr
可以是0.01,0.02或0.03。但是,由于Index
的某些元素无法舍入为2位数(尽管它们看起来都是这样),因此我无法为任何r和dr计算res
。
我该如何解决这个问题?提前感谢您的建议!
答案 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!