不能将小数舍入到R中的两位小数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不能将小数舍入到R中的两位小数相关的知识,希望对你有一定的参考价值。
我尝试过不同的函数将小数点数舍入为两位数,例如format()
,formatC()
,signif()
和round()
。它们都不能真正将所有小数舍入到小数点后两位。
例如,我的数据框DF有三列:索引,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。
我的目的是计算columnCDF
的任何两个元素之间的差异,并通过指示它们的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
。
我该如何解决这个问题?提前感谢您的建议!
在unique
函数的某个点上,如果两个Index-Diffs是相同的,那么函数必须进行测试,它可能会用==
来做。但是,将浮点值与==
进行比较并不是一个好主意。使用您最喜欢的搜索页面“浮点相等”或“浮点比较”或在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!
以上是关于不能将小数舍入到R中的两位小数的主要内容,如果未能解决你的问题,请参考以下文章
将 BigDecimal 舍入为 *always* 有两位小数
excel截取小数点前的函数,例如:500.00,我要截取500