漂浮在红宝石中的精度

时间:2012-09-22 07:50:33

标签: ruby

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

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

因此

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

这正是我的应用程序需要正确的计算方式。

这是预期的吗?我该怎么办呢?

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:2)

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

((113 * 0.01) - 1.13).abs<1e-10