R中的浮点问题?

时间:2011-07-29 14:43:04

标签: r floating-point floating-accuracy

  

可能重复:
  Why are these numbers not equal?

以下表达式(评估为0.1)被认为大于0.1。

> round(1740/600,0) - 1740/600
[1] 0.1
> (round(1740/600,0) - 1740/600) <= 0.1
[1] FALSE //???!!???
> (round(1740/600,0) - 1740/600) <= 0.1000000000000000000000000000000000000001
[1] TRUE

认为问题可能是由于四舍五入,我尝试了同样的结果:

> 3 - 2.9
[1] 0.1
> (3 - 2.9) <=0.1
[1] FALSE

那么,是什么给出了,如何在没有捏造截止的情况下解决它?

2 个答案:

答案 0 :(得分:13)

有些R函数可以自动采取合理的方法解决“平等问题”:

> (3 - 2.9) <=0.1
#[1] FALSE

> all.equal( (3 - 2.9) , 0.1)
#[1] TRUE

它使用R的最小正浮点数的sqrt作为其默认阈值,因此它处理乘法和除法传播错误。结束时间约为1e-08

答案 1 :(得分:11)

来自Floating-Point Guide

  

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且   相反,我得到一个奇怪的结果,如0.30000000000000004?

     

因为在内部,计算机使用格式(二进制浮点)   它不能准确地表示0.1,0.2或0.3之类的数字。

     

编译或解释代码时,您的“0.1”已经存在   四舍五入到该格式的最接近的数字,这导致一个小的   甚至在计算发生之前就会出现舍入错误。

     

我该怎么做才能避免这个问题?

     

这取决于你正在做什么样的计算。

     
      
  • 如果你真的需要你的结果准确加起来,特别是当   你使用金钱:使用特殊的十进制数据类型。
  •   
  • 如果你愿意的话   不想看到所有这些额外的小数位:只需格式化你的   结果在显示时四舍五入到固定的小数位数。
  •   
  • 如果您没有可用的十进制数据类型,则可以使用另一种方法   用整数,例如完全以美分进行货币计算。但是这个   是更多的工作,并有一些缺点。
  •