R中的舍入误差?

时间:2018-07-20 21:08:26

标签: r rounding

请考虑以下内容:

> x<-178379.4999999999999999999999999999999
> x
[1] 178379.5
> round(x)
[1] 178380

这似乎是一个基本的舍入错误。 R中是否存在已知的舍入误差?还是因为即使在工作存储器中,R也最多只能处理22位数字?

3 个答案:

答案 0 :(得分:4)

这是两个非常频繁的常见问题解答的组合。

  • 有限浮点精度:此R FAQ 7.31,请参见例如Why are these numbers not equal?。该值四舍五入为178379.5。如果将options(digits=22)设置为将数字打印到小数点后的位置,将无济于事。精度已丢失,因为(按照您的建议)R仅存储不超过53个二进制/ 22位十进制精度的值。
  • 四舍五入:R“四舍五入为偶数”,请参见Is there an error in round function in R?。这意味着该值将被四舍五入。

这不是关于打印精度的。

如果您使用较少的'9',您会看到预期的结果(这是R有限的 printing 精度与预期的取整的组合)

> x <- 178379.49
> 
> x
[1] 178379.5  ## prints as .5, but full precision is present
> round(x)
[1] 178379

答案 1 :(得分:3)

由于硬件中使用浮点表示,因此问题可能更广泛。

不确定this website是否有用,但是它表明您在写入178379.49999999999999999999999999999999999时实际存储的数字为178379.5(根据IEEE-754浮点标准):

178379.5 is what is stored when you write 178379.4999999999999999999999999999999

答案 2 :(得分:2)

有关大于15的数字的说明,请参见def

  

大位数

     

请注意,对于较大的数字值(当前用于大于等于16的数字),有效位数的计算将取决于平台的sprintf()功能的内部(C库)实现。

请参见this question for more info on R's precision