这里有什么不对? (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>
答案 0 :(得分:10)
为什么我的数字,如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)