2009-08-06 11 views
1

マネージC++でdouble値を解析する際に奇妙な問題が発生しています。私は何か間違っているかもしれない。私が行うとき:double.Parse in Managed C++

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

は、結果の出力は0.006000000000001です。なぜ1を追加しているのですか?

また、小数点以下5桁まで丸めた場合、失敗します。私がやっている:

result2 = Math::Round(result, 5) 

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

答えて

0

正常です。この問題は、倍精度実数0.006のIEEE形式によって引き起こされ、無限の2進数の近似値として表されます。 だから、あなたは3つの方法がある - 出力にフォーマットする

  • 使用対応する文字列
  • が使用DECIMAL型
  • は、例えば、代わりに一定のエラーで<または>を使用して、数字を比較するために==使用しないでください。( X -0.06)<エラー
3

これは精度によるものです。私はこの答えにhereを与えた:

フロートとダブルスは、特定の 精度で数 表現したものです。この値はすべて であるとは限りません。 hereも参照してください。

あなたは簡単にこれが 場合である理由を考えることができます:ちょうどintervall (1..1)における数の無制限 数があるが、フロートのみ表現するビットの限られた 数を持っていますすべて の数値は(-MAXFLOAT..MAXFLOAT)です。

はもっと適切に置く:32ビット整数 表現で表現される整数の可算 数、 がある。しかし が完全に制限された 表現で表すことができない実際の値の無限無数 数があります32または64ビット。 したがって、最大値と最小値の には実際の値である の値に限界があるだけでなく、正確さにも限界があります。

浮動小数点の後に の数字が少ししかないのはなぜですか? は影響を受けますか?表現 は、 の代わりにバイナリ・システムに基づいているため、他の数字を容易に を小数点以下を表すようにします。

0

倍精度数は、本質的に近似しており、頻繁にあなたを取り除くことができない尾を持っている - すなわち、より正確な数を表現する方法はありません。

decimalを使用すると、予想通りに結果を得ることができますが、これは近似値ですが、ベース10を使用するため、人々の期待に近いように動作する傾向があります。しかし、それはCPUタイプにマップされないので、遅くなります。