Float オブジェクトで数学を行っている場合があり、to_i を呼び出すと 1 減ります。
value = 0.29 * 100
value.to_i
=> 28
浮動小数点数が不正確な表現であることは知っていますが、これは予想以上にずれています。どうすればこれを防ぐことができますか?
Ruby 1.8.7 を使用しています (1.8.6 でも発生します)。
Float オブジェクトで数学を行っている場合があり、to_i を呼び出すと 1 減ります。
value = 0.29 * 100
value.to_i
=> 28
浮動小数点数が不正確な表現であることは知っていますが、これは予想以上にずれています。どうすればこれを防ぐことができますか?
Ruby 1.8.7 を使用しています (1.8.6 でも発生します)。
(0.29 * 100).round
=> 29
すべての浮動小数点数が不正確というわけではありません。29
正確0.25
です、正確ですが、0.29
そうではありません。小数点以下 50 ビットが 1 ビットでも欠けている場合、デフォルトの切り捨て変換では、次に小さい整数が返されます。
#round
そしてそれが存在する理由です。
0.29 * 100
irb で簡単に確認すると、 が に評価されることがわかり28.999...
ます。Float#to_i
残りは呼び出して、最終的に 28 になります。