C# double
比較: 精度の問題
浮動小数点数 (C# の double
型など) を扱うと、値を比較するときに予期せぬ問題が発生することがよくあります。 一般的な例は、double
変数を 0.1:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { /* Code */ }</code>
この一見単純な比較は、驚くほど失敗する可能性があります。
問題の理解: 2 進表現と 10 進表現
根本的な原因は、浮動小数点数の格納方法にあります。 double
値は、小数ではなく、二進数として保存されます。これは、0.1 を含む多くの 10 進数値を 2 進分数として正確に表すことができないことを意味します。 コンピューターは代わりに近似値を保存するため、比較に影響を与える微妙な違いが生じます。
解決策: decimal
データ型の使用
この精度の問題を回避するには、decimal
データ型を使用します。 decimal
値は 10 進数表記を使用して保存されるため、0.1 などの数値を正確に表現できます。
<code class="language-csharp">decimal x = 0.1m; if (x == 0.1m) { /* Code */ }</code>
decimal
を使用すると、0.1 の正確な保存と比較が保証されます。
浮動小数点表現: より詳しく見る
問題を説明するために、10 進数表現を考えてみましょう。 12.34 は次のとおりです:
<code>1 * 10^1 + 2 * 10^0 + 3 * 10^-1 + 4 * 10^-2</code>
同様に、0.1 は次のとおりです。
<code>1 * 10^-1</code>
ただし、2 進数では、一部の数値 (1/10、10 進数の 0.1 など) は正確な表現に欠けます。 これらは近似されるため、比較時に予期しない結果を引き起こす不一致が生じます。 この近似は、x == 0.1
が x
である場合に double
が失敗する可能性がある理由です。
以上が`x == 0.1` が C# の `double` データ型で常に機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。