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

C# で `x == 0.1` が `double x = 0.1` で機能しないのはなぜですか?

Susan Sarandon
リリース: 2025-01-22 20:51:13
オリジナル
692 人が閲覧しました

Why Doesn't `x == 0.1` Work with `double x = 0.1` in C#?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート