我有一个计算,生成似乎是 Float 22.23 和文字 22.23,如下所示:
some_object.total => 22.23
some_object.total.class => Float
22.23 => 22.23
22.23.class => Float
但由于某种原因,以下内容是错误的:
some_object.total == 22.23 ? true : false
很古怪,对吧?
是否使用了某种可能通过 some_object.total 调用并不完全透明的精确机制?
浮点数不能精确表示其范围内的所有十进制数。例如,0.9 并不完全是 0.9,它是一个非常接近 0.9 的数字,在大多数情况下最终都会被打印出来。当您进行浮点计算时,这些错误会累积,最终您会得到非常接近正确数字但不完全等于它的值。例如,0.3 * 3 == 0.9
将返回false
。您将使用的每种计算机语言都是如此 - 这就是二进制浮点数学的工作原理。例如,参见这个关于 Haskell 的问题.
要测试浮点相等性,您通常需要测试该数字是否在目标的某个微小范围内。因此,例如:
def float_equal(a, b)
if a + 0.00001 > b and a - 0.00001 < b
true
else
false
end
end
您还可以使用 Ruby 中的 BigDecimal 类来表示任意十进制数。
如果这是一个测试用例,您可以使用assert_in_delta
:
def test_some_object_total_is_calculated_correctly
assert_in_delta 22.23, some_object.total, 0.01
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)