ruby计算漂浮物是否错误?

时间:2011-08-17 11:42:05

标签: ruby floating-point floating-accuracy

这里有什么不对? (ruby版本:1.9.2p290(2011-07-09修订版32553)[x86_64-darwin11.0.0]

x = 523.8
w = 46.9
xm = x + w
assert_equal w, (xm - x) # FAILS with: <46.9> expected but was <46.89999999999998>

4 个答案:

答案 0 :(得分:10)

来自The Floating-Point Guide

  

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

     

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

     

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

阅读链接到网站,了解详细信息以及解决此问题的方法。

答案 1 :(得分:6)

这是完全正常的;这是关于浮点运算的低级概念而不是Ruby的事实,因此可以在任何语言中出现。

浮点运算并不准确。平等应该用assert((xm-x).abs < epsilon)的紧密度代替,其中epsilon是一些像0.01这样的小数字。

答案 2 :(得分:1)

阅读this。它描述了浮点数的二进制表示在每种语言中的工作方式,而不仅仅是Ruby。

答案 3 :(得分:0)

您的问题的答案是:

(其他答案告诉你原因,但你没有问过。:p)