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
でしょうか?