1

我正在编写一个使用浮点数的 ruby​​ 程序。我在精度上有问题。例如

1.9.3p194 :013 > 113.0 * 0.01
# => 1.1300000000000001

因此

1.9.3p194 :018 > 113 * 0.01 == 1.13
# => false

这正是我的应用程序需要正确进行的那种计算。

这是预期的吗?我应该如何处理这个?

4

2 回答 2

4

这是浮点数的固有限制(即使 0.01 也没有精确的二进制浮点表示)。您可以使用 Aleksey 提供的技术,或者,如果您想要完美的精度,请使用 ruby​​ 中捆绑的 BigDecimal 类。它更冗长,更慢,但它会给出正确的结果:

require 'bigdecimal'
=> true
1.9.3p194 :003 > BigDecimal.new("113") * BigDecimal("0.01")
=> #<BigDecimal:26cefd8,'0.113E1',18(36)> 
1.9.3p194 :004 > BigDecimal.new("113") * BigDecimal("0.01") == BigDecimal("1.13")
=> true 
于 2012-09-22T08:09:28.103 回答
2

在使用 float 进行计算时,您应该使用 sigma 方法 - 这意味着不比较两个值,而是将它们的绝对差与非常小的值进行比较 - 例如 1e-10。

((113 * 0.01) - 1.13).abs<1e-10
于 2012-09-22T07:53:43.090 回答