10/02/15 15:49:33
>>556
5.6を10500回足したものが、本当は58800よりもほんの少しだけ小さいから
irb> (5.6 * 10500) - 58800
-7.27595761418343e-12
より正確には、2進数で表現される5.6が10進数で考える本来の5.6よりもほんの少しだけ小さいから
Float#to_iは「切り捨て」を行うので、「58800よりもほんの少しだけ小さい数」の小数部を切り捨てて、58799になる
これを簡易に防ぐには、>>557の言うように四捨五入のメソッドを整数化処理として擬似的に使う
誤差が0.5を超すことは一般的用途ではまずないから
irb> (5.6 * 10500).round
58800
もし本当に厳密に計算を行いたいのならbigdecimalライブラリを使う
irb> require 'bigdecimal'
irb> (BigDecimal.new("5.6")*BigDecimal.new("10500")).to_s
"0.588E5"