Ruby的BigDecimal类中的浮点错误?

时间:2016-07-20 19:45:37

标签: ruby bigdecimal floating-accuracy

避免ruby中的浮点错误的通用建议是使用BigDecimal。我必须忽略一些东西,因为我认为我发现了一个BigDecimal数学返回错误的情况,其中Float没有:

使用Float给出2.75的正确答案:

public void getResource(@PathParam("param") String id,
                  final @Suspended AsyncResponse response)

使用BigDecimal给出错误答案2.74999999:

> 50.0 * 0.6 / 360.0 * 33
=> 2.75

有人请告诉我,我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

让我们简化您的示例,并改为使用此示例:

BigDecimal(1) / BigDecimal(3)
# => #<BigDecimal:1921a70,'0.3333333333 33333333E0',18(36)>

它是如何实现的?

Rational

BigDecimal不提供有理数,所以当你将1除以3​​时,得到0,后跟很多3。很多,但不是无限多。然后,当你乘以3时,你会得到0,然后是相同的9s。

我相信你误读了BigDecimal的广告(虽然我不确定它是否被宣传为浮点错误的解决方案)。它只提供任意精度。它仍然是一个浮点数。如果您在分割数字时确实需要确切的数字,可以查看(Rational(50) * Rational(0.6) / Rational(360) * Rational(33)).to_f # => 2.75 类:

{{1}}