2

次のコードがある場合 (これは .NET で記述されています)

double i = 0.1 + 0.1 + 0.1;

なぜi等しくないの0.3ですか?
何か案は?

4

7 に答える 7

6

浮動小数点数について調べる必要があります。多くの 10 進数は 2 進数で正確に表現されていないため、完全に一致することはありません。

そのため、比較では次のことがよく見られます。

if (abs(a-b) < epsilon) { ...

ここで、必要な精度に応じて、epsilon は 0.00000001 などの小さな値になります。

于 2008-10-23T07:10:34.350 に答える
3

Double は 64 ビットの浮動小数点データ型です。小数を近似値として格納します。正確な値が必要な場合は、2 進化 10 進数データ型である 10 進数データ型を使用してください

于 2008-10-23T07:10:56.000 に答える
1

浮動小数点演算の精度は保証されません。

于 2008-10-23T07:09:39.263 に答える
1

表現には常に問題があるため、浮動小数点数との等価性はしばしば使用されません。通常、2 つの float の差を比較し、それが特定の値 (たとえば 0.0000001) より小さい場合、等しいと見なされます。

于 2008-10-23T07:11:08.763 に答える
1

二重計算は正確ではありません。あなたには2つの解決策があります:

  • Decimal正確なタイプを使用してください
  • abs(i - 0.3) < エスピロンを比較
于 2008-10-23T07:11:34.860 に答える
1

Jon Skeet は、これについて非常に優れたウォークスルーを提供しています。ここdecimal でも同じです。

于 2008-10-23T07:18:35.377 に答える
0

このスレッドを見てください:

21.399999618530273 のような 21.4 のような値に初期化された double 変数が表示されるのはなぜですか?

于 2008-10-23T07:25:04.617 に答える