避免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
有人请告诉我,我在这里缺少什么?
答案 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}}