我正在写一个使用浮点数的ruby程序。我在精确度方面有问题。例如
1.9.3p194 :013 > 113.0 * 0.01
# => 1.1300000000000001因此
1.9.3p194 :018 > 113 * 0.01 == 1.13
# => false这正是我的应用程序需要正确计算的类型。
这是意料之中的吗?我该如何处理这件事?
发布于 2012-09-22 16:09:28
这是浮点数的固有限制(即使是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-22 15:53:43
在使用浮点数进行计算时,你应该使用sigma方法-这意味着不比较两个值,而是将它们的绝对差与非常小的值- 1e-10进行比较。
((113 * 0.01) - 1.13).abs<1e-10https://stackoverflow.com/questions/12541907
复制相似问题