C# で double 値を比較する信頼性の高い方法
C# では、浮動小数点演算の固有の制限により、倍精度値の比較により予期しない結果が生じることがよくあります。なぜこのようなことが起こるのかを理解するために、浮動小数点の精度が不足する理由を詳しく調べてみましょう。
浮動小数点の精度が不十分です
float データ型と double データ型は、数値をバイナリ形式で保存します。この形式には本質的に、0.1 などの単純な 10 進数値を含む特定の数値を正確に表す精度がありません。 double に値 0.1 が割り当てられると、実際には、実際の 10 進数値の近似値である 2 進表現が格納されます。この精度の欠如は、10 進数を 2 進数の分数に変換する性質に起因します。
考えられる解決策
double 値の比較を効率的に処理するには、次の解決策を検討してください:
double-to-double 値の比較: double 値を比較する場合、通常は等価演算子 (==) を使用することは推奨されません。代わりに、近似比較方法を使用して、潜在的な丸め誤差を考慮することができます。 これには通常、許容値を定義し、2 つの値の差がその許容値未満であるかどうかを比較することが含まれます。
10 進数データ型: 正確な数値演算と比較を行うには、値を 10 進数表記で保存する 10 進数データ型の使用を検討してください。このアプローチにより、0.1 などの小数値を正確に表現できるようになります。
追加手順
float および double ストレージの精度の欠如は、バイナリ表現が 1/2、1/4 などの 2 のべき乗の数値に自然に適合するという事実によるものです。ただし、0.1 (1/10) などの特定の分母を持つ小数は、丸め誤差を生じずに 2 進数で正確に表すことはできません。
例
<code class="language-csharp">double x = 0.1; double y = 0.1; double tolerance = 0.000001; // 定义容差 if (Math.Abs(x - y) < tolerance) // 使用容差进行近似比较 { // 代码块 }</code>
この例では、Math.Abs()
を使用して 2 つの double 値間の絶対差を計算し、それを事前定義された許容誤差と比較して、より信頼性の高い double 値の比較を可能にする方法を示します。 適切な許容値の選択は、特定のアプリケーション シナリオと精度要件によって異なります。
以上がC# で Double 値を安全に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。