ReSharper 2026.1 Help

コードインスペクション: 浮動小数点数の等価比較​演算子による比較

==/!= 演算子を使って浮動小数点数を比較するのは、一般的に良くない考えです。 浮動小数点値は本質的に不正確であり、等値として厳密に比較するのはほとんど望ましいセマンティクスではありません。 ==/!= 演算子による比較は、浮動小数点値の表現が完全に一致するかどうかを確認しますが、精度損失を伴う計算を行った場合は一致することはほとんどありません。 例えば、簡単な算術演算を 2 つ行ってみましょう―

  • 0.111 回を追加

  • 0.111 を乗算する

— そして、それらの浮動小数点の結果が等しいかどうかを確認します。

double add = 0; for (int i = 1; i <= 11; i++) { add += 0.1; } double multiply = 0.1 * 11; Console.WriteLine(add == multiply); // false

テスト実行では add = 1.0999999999999999multiply = 1.1000000000000001 となり(ただし、異なるランタイムでは異なる結果になることがあります)、そのため == 演算子による比較結果は false となります。

この種の比較を正しく行うには、許容値、つまり結果が意図した値からどれだけ逸脱できるかを示す値を指定する必要があります。 ReSharper は、比較を自動的に Math.Abs([expression]) < [tolerance] へ書き換えるのに役立ちます。 tolerance 値は、実行する計算の精度に依存します。 この例では、 0.000000001 の許容誤差に安全に依存できます。

double add = 0; for (int i = 1; i <= 11; i++) { add += 0.1; } double multiply = 0.1 * 11; var tolerance = 0.000000001; Console.WriteLine(Math.Abs(add - multiply) < tolerance); // true

このインスペクションは、ゼロ以外の値が予期される場合に「まだ初期化されていない値」または「値が存在しない」ことを表す 0+Infinity-InfinityNaN など、「マーカー値」としてよく使用される一部の値を無視することに注意してください。

ただし、これを行うためのより良い方法は、 null 値を持つ double? タイプです。

2026 年 6 月 12 日