gpt4 book ai didi

Ruby Float#round 方法与 round(2) 的行为不正确

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:26 26 4
gpt4 key购买 nike

我了解到建议使用 BigDecimal 而不是 Float,但这要么是一个错误,要么突出了 Float 的深奥本质.似乎 Float#round(2) 对“1.015”、“1.025”和“1.035”有问题。

1.015.round(2)
=> 1.01 # => WRONG .. should be 1.02
1.025.round(2)
=> 1.02 # => WRONG .. should be 1.03
1.035.round(2)
=> 1.03 # => WRONG .. should be 1.04
1.045.round(2)
=> 1.05 # => CORRECT
1.016.round(2)
=> 1.02 # => CORRECT

round(3) 工作正常。

1.0015.round(3)
=> 1.002 # => CORRECT
1.235.round(2)
=> 1.24 # => CORRECT

为了在 Rails 应用程序中打补丁,我这样做了:

config/initializers/float_mp.rb

require 'bigdecimal'

class Float
def round(val=0)
BigDecimal.new(self.to_s).round(val).to_f
end
end

这似乎是一种奇怪且昂贵的解决方法。这可能是 Float#round 中的错误吗?

最佳答案

AFAICS ruby​​ round() 工作正常。大概它只是 libm 中 round() 函数的包装器。

所以原因是你的浮点文字不能用二进制精确表示。例如。 “1.015”加上几位小数得到“1.0149999999999999”;因此,当四舍五入到两位小数时,1.01 比 1.02 更接近真实值。对于您的其他示例,依此类推。

另请记住,默认的 IEEE 754 舍入模式是“舍入到最近,与偶数相关”,这与您可能在学校熟悉的“舍入到最近,与零相关”不同.

关于Ruby Float#round 方法与 round(2) 的行为不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12455633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com