漂浮在ruby中的精度

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

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

因此

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

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

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

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

 require 'bigdecimal' => true 1.9.3p194 :003 > BigDecimal.new("113") * BigDecimal("0.01") => # 1.9.3p194 :004 > BigDecimal.new("113") * BigDecimal("0.01") == BigDecimal("1.13") => true 

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

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