問題ます。構文解析によって管理されたC++
-
11-09-2019 - |
質問
どんどん変な問題を解析double値によって管理されたC++.っているのかもしれませんやっても間違っています。い場合は:
double value = 0.006;
result = Math::Parse( value)
の出力結果 0.006000000000001
.なぜで追加1?
また、丸の値を5桁で失敗します。んでいるのは:
result2 = Math::Round(result, 5)
が result2
常に 0.006000000000001
.なぜですか?
解決
では正常です。この問題によるIEEE形式のダブルルのリアルタイ0.006の代表的なものである近似の無限バイナリーの一部。いの3つの方法-
- 使用に対応する文字列formating出力
- 利用小数点タイプ
- 使用しない==比較番号の代わりに使用 < 以上に一定のエラー。g:(X-0.06) < エラー
他のヒント
これは精度によるものです。私はここのこの回答はを与えます:
フロートとダブルスは多数あります 一定で表現 精度。必ずしもすべての値は、することができ この形式で表現。見る ここにもを。
あなたは簡単になぜこれだろうと考えることができます ケースで:無制限があります ちょうどintervallの数字の数 (1..1)が、フロートは限らを有します 全てを表現するビット数 (-MAXFLOAT..MAXFLOAT)内の数字。
より適切に置く:32ビット整数に 表現可算があります 表現する整数の個数、 しかし、無数の無限あり することはできません実際の値の数 完全限定で表現 32または64ビットの表現。 そのためだけでなく、には限界があります 最高と最低の表現 実際の値は、だけでなく、精度ます。
なぜ少しを持っている数です 浮動小数点の桁 影響を受けましたか?表現ので、 代わりのバイナリシステムに基づいています 簡単に他の数字を作る進、 そして、小数点のものを表します。
倍精度数は、本質的に近似しており、頻繁に取り除くことはできませんあなたが尾を持っているの - 。より正確に数を表現する方法がない、すなわち
あなたがdecimal
を使用する場合より多くのあなたのような結果が予想されるかもしれません - まだ近似であるが、それは基本-10を使用しているので、人々が期待する以上のように動作する傾向があります。それはCPUの種類にマップされないので、しかし、それが遅くなります。