ホームページ >バックエンド開発 >C++ >`x == 0.1` が C# の `double` データ型で常に機能しないのはなぜですか?

`x == 0.1` が C# の `double` データ型で常に機能しないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-22 20:46:11633ブラウズ

Why Doesn't `x == 0.1` Always Work with C#'s `double` Data Type?

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.1x である場合に double が失敗する可能性がある理由です。

以上が`x == 0.1` が C# の `double` データ型で常に機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。