以下表达式(评估为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
那么,是什么给出了,如何在没有捏造截止的情况下解决它?
答案 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)
为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且 相反,我得到一个奇怪的结果,如0.30000000000000004?
因为在内部,计算机使用格式(二进制浮点) 它不能准确地表示0.1,0.2或0.3之类的数字。
编译或解释代码时,您的“0.1”已经存在 四舍五入到该格式的最接近的数字,这导致一个小的 甚至在计算发生之前就会出现舍入错误。
我该怎么做才能避免这个问题?
这取决于你正在做什么样的计算。
- 如果你真的需要你的结果准确加起来,特别是当 你使用金钱:使用特殊的十进制数据类型。
- 如果你愿意的话 不想看到所有这些额外的小数位:只需格式化你的 结果在显示时四舍五入到固定的小数位数。
- 如果您没有可用的十进制数据类型,则可以使用另一种方法 用整数,例如完全以美分进行货币计算。但是这个 是更多的工作,并有一些缺点。