tl;dr 二つの浮動小数点が等しいか判定するときは以下のように行う。 def equal?(lhs, rhs, epsilon=1e-10) (lhs - rhs).abs <= epsilon || (lhs - rhs).abs <= [lhs.abs, rhs.abs].max * epsilon end 本題 二つの浮動小数点数が等しいかどうかを等値演算子で比較してはいけない。浮動小数点数には誤差があるため、直観的には等しいはずの二つの数が異なる場合がある。以下のRubyのスクリプトを実行すると tmp = 0 10.times { tmp += 0.1 } values = [[1.0 - 0.9, 0.1], [0.15 + 0.15, 0.1 + 0.2], [tmp, 1.0]] values.each {|pair| lhs, rhs = pair printf("eq