C# の倍精度比較を理解する
問題:
C# で double
変数を直接比較すると、予期しない結果が生じる可能性があります。たとえば、if (x == 0.1)
に値 false
が割り当てられている場合でも、x
は 0.1
と評価される可能性があります。
根本原因:
この問題は、浮動小数点数 (float
や double
など) がコンピューターのメモリ内でどのように表現されるかに起因します。私たちが慣れ親しんでいる 10 進の小数表現とは異なり、2 進の小数表現が使用されます。 これは、0.1 などの多くの 10 進数値を 2 進数で正確に表現できないことを意味します。 結果の近似には、微妙な丸め誤差が生じます。
解決策:
最も効果的な解決策は、精度が最も重要な場合に decimal
データ型を使用することです。 decimal
は 10 進の小数表現を採用しており、0.1 などの値を正確に格納できます。
詳細:
2 進分数は、10 進数の分数と同様に、10 の累乗ではなく 2 の累乗を使用します。1/3 (0.3333...) が 10 進数で正確に表現できないのと同様、1/10 (0.1) には正確な 2 進表現がありません。 。 この固有の制限により、比較の不一致を引き起こす丸め誤差が生じます。 コンピューターは 0.1 の近似値を保存しますが、この近似値は比較で使用されるリテラルの 0.1 と正確には等しくありません。
以上がC# で Double 値を比較すると False が返されることがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。