gpt4 book ai didi

ruby-on-rails - 为什么 Ruby 会在 2 个看起来相同的 float 上失败?

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:57 24 4
gpt4 key购买 nike

我有一个计算生成看起来像 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 调用完全透明的精确机制?

最佳答案

float 不能精确表示其范围内的所有小数。例如,0.9 并不完全是 0.9,它是一个非常接近 0.9 的数字,在大多数情况下最终会按原样打印。当您进行浮点计算时,这些错误会累积,最终您会得到非常接近正确数字但不完全等于正确数字的结果。例如,0.3 * 3 == 0.9 将返回 false。您将使用的每一种计算机语言都是这种情况——这就是二进制 float 学的工作原理。参见,例如,this question about 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

关于ruby-on-rails - 为什么 Ruby 会在 2 个看起来相同的 float 上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com