C# での浮動小数点数の比較: 10 進数のジレンマ
C# では、型 double
の値を比較するときに問題が発生する可能性があります。次のコードを考えてみましょう:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { // ... }</code>
驚くべきことに、このコードは if
ステートメントに入りません。これはなぜでしょうか?
浮動小数点数の問題
問題の根本は、コンピューターが浮動小数点数 (特に double
) を表現する方法にあります。整数とは異なり、double
は小数ではなく二進の分数を使用します。これは、0.1 などの一部の 10 進数値を正確に保存できないことを意味します。
たとえば、2 進数表記では、0.1 は 0.000110011001100110011001 と表されます。コンピューターはこの小数の無限ループを有限表現に切り捨てるため、期待値と正確に一致しない可能性があります。
解決策
この問題を解決するには、次の方法が考えられます:
decimal
型の使用: decimal
型は、10 進数表記を使用して数値を格納するため、正確な表現が可能になります。 Math.Abs(x - 0.1)
) を使用します。 理由の説明
2 進数の分数は、特定の数値を表す能力において 10 進数の分数とは異なります。たとえば、数値 1/10 は 2 進数で正確に表すことができないため、2 進展開すると約 0.0001100 になります... コンピュータの丸め処理により、浮動小数点数を格納するときに不正確さが生じます。
以上がC# で `x == 0.1` が `double x = 0.1` で機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。