フロートを使用するルビープログラムを書いています。精度に問題があります。例えば
1.9.3p194 :013 > 113.0 * 0.01
# => 1.1300000000000001
したがって
1.9.3p194 :018 > 113 * 0.01 == 1.13
# => false
これはまさに私のアプリが正しく行うために必要な種類の計算です。
これは期待されていますか?これをどのように処理すればよいですか?
フロートを使用するルビープログラムを書いています。精度に問題があります。例えば
1.9.3p194 :013 > 113.0 * 0.01
# => 1.1300000000000001
したがって
1.9.3p194 :018 > 113 * 0.01 == 1.13
# => false
これはまさに私のアプリが正しく行うために必要な種類の計算です。
これは期待されていますか?これをどのように処理すればよいですか?
これは浮動小数点数に固有の制限です(0.01でも正確な2進浮動小数点表現はありません)。Alekseyが提供する手法を使用するか、完全な精度が必要な場合は、rubyにバンドルされているBigDecimalクラスを使用できます。より冗長で低速ですが、正しい結果が得られます。
require 'bigdecimal'
=> true
1.9.3p194 :003 > BigDecimal.new("113") * BigDecimal("0.01")
=> #<BigDecimal:26cefd8,'0.113E1',18(36)>
1.9.3p194 :004 > BigDecimal.new("113") * BigDecimal("0.01") == BigDecimal("1.13")
=> true
floatを使用した計算では、シグマ法を使用する必要があります。これは、2つの値を比較するのではなく、それらの絶対差をごくわずかな値(たとえば、1e-10)と比較することを意味します。
((113 * 0.01) - 1.13).abs<1e-10