丸め誤差
Rubyでは以下のように小数の計算で期待しない結果になることがある。(他の言語でもよく発生する)
0.1 * 6.0
# => 0.6000000000000001
そのため以下のような現象が起こる。
0.1 * 6.0 == 0.6
# => false
0.1 * 6.0 <= 0.6
# => false
対処法
Rational(有理数)クラスを使うことで期待した結果が得られる。
以下のように数値の後ろにrを付けるとRationalクラスの数値になる。
0.1r * 6.0r
# => (3/5)
0.1r * 6.0r == 0.6
# => true
値が変数に入っている場合はrationalizeメソッドを呼び出して、Rationalクラスの数値に変換できる。
x = 0.1
y = 6.0
x.rationalize * y.rationalize
# => (3/5)
小数に戻したい場合はto_fメソッドを呼ぶ。
(0.1r * 6.0r).to_f
# => 0.6
x = 0.1
y = 6.0
(x.rationalize * y.rationalize).to_f
# => 0.6
参考文献
伊藤 淳一 「プロを目指す人のためのRuby入門」, 技術評論社, 2017