1

マネージ C++ で double 値を解析しているときに奇妙な問題が発生します。私が何か間違ったことをしているのかもしれません。私がする時:

double value = 0.006;
result = Math::Parse( value)

結果の出力は0.006000000000001. なぜ1を追加するのですか?

また、値を小数点以下 5 桁に丸めると、失敗します。私がやっている:

result2 = Math::Round(result, 5)

しかしresult2、常に0.006000000000001です。私は何を間違っていますか?

4

3 に答える 3

3

これは精度によるものです。ここでこの答えを出しました:

float と double は、特定の精度を持つ数値表現です。すべての値をこの形式で表現できるわけではありません。こちら もご覧ください

なぜそうなるのかは簡単に想像できます: 間隔 (1..1) 内には無制限の数の数値がありますが、float は (-MAXFLOAT.. MAXFLOAT)。

より適切に言えば、32 ビットの整数表現では、表現できる数え切れない数の整数がありますが、32 ビットまたは 64 ビットの限られた表現では完全に表現できない無限の無数の実数値があります。したがって、表現可能な実数値の最大値と最小値だけでなく、精度にも制限があります。

では、浮動小数点の後の桁数が少ない数値が影響を受けるのはなぜでしょうか? 表現は 10 進数ではなく 2 進数に基づいているため、10 進数以外の数値を簡単に表現できます。

于 2009-08-06T12:37:15.710 に答える
0

正常です。double の IEEE 形式によって引き起こされるこの問題は、実数 0.006 は、無限の 2 進分数の近似値として表されます。だからあなたには3つの方法があります -

  • 対応する文字列書式を使用して出力する
  • Decimal 型を使用する
  • == を使用して数値を比較しないでください。代わりに < または > を使用して一定のエラーを指定してください。例: (X -0.06) < エラー
于 2009-08-06T12:41:59.613 に答える
0

倍精度数は本質的に近似値であり、多くの場合、取り除けない裾があります。つまり、数値をより正確に表現する方法はありません。

を使用すると、期待どおりの結果が得られる可能性があります。decimalこれはまだ概算ですが、基数 10 を使用するため、人々が期待するように動作する傾向があります。ただし、CPU タイプにマップされないため、遅くなります。

于 2009-08-06T12:37:39.687 に答える