コードインスペクション:浮動小数点数の等値比較
==/!= 演算子を使って浮動小数点数を比較するのは、一般的に良くない方法です。 浮動小数点値は本質的に不正確であり、それらを正確に等値として比較するのは、ほとんどの場合、意図したセマンティクスではありません。 ==/!= 演算子による比較は、浮動小数点値の表現が完全に同じであることを確認しますが、精度損失を伴う算術演算を行った場合、これはほとんど起こりません。 例えば、簡単な算術演算を 2 つ行ってみましょう―
0.111回を追加0.1に11を乗算する
— そして、それらの浮動小数点の結果が等しいかどうかを確認します。
テスト実行では、 add = 1.0999999999999999 と multiply = 1.1000000000000001 となります(異なるランタイムでは異なる結果になることもあります)。そのため、 == 演算子による比較は false となります。
この種の比較を正しく行うには、許容値、つまり結果が意図した値からどれだけ逸脱できるかを示す値を指定する必要があります。 JetBrains Rider は、比較を自動的に Math.Abs([expression]) < [tolerance] に書き換えるのに役立ちます。 tolerance 値は、実行する計算の精度に依存します。 この例では、 0.000000001 の許容誤差に安全に依存できます。
このインスペクションは、ゼロ以外の値が予期される場合に「まだ初期化されていない値」または「値が存在しない」ことを表す 0、 +Infinity、 -Infinity、 NaN など、「マーカー値」としてよく使用される一部の値を無視することに注意してください。
ただし、これを行うためのより良い方法は、 null 値を持つ double? タイプです。