不能将小数舍入到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是任意数量的Indexdr是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* 有两位小数

JS实现浮点数精确舍入小数点

将C ++中的浮点数舍入到一个小数位

excel截取小数点前的函数,例如:500.00,我要截取500

如何在 Torch 的 GPU 上将张量的元素限制/舍入到小数点后 4 位?

ActionScript 3 将数字舍入到小数位