托管 C++ 中的 double.Parse 问题
我在解析托管 C++ 中的双精度值时遇到一个奇怪的问题。 可能是我做错了什么。 当我这样做时:
double value = 0.006;
result = Math::Parse( value)
结果的输出是0.006000000000001
。 为什么要加1呢?
另外,当我将值四舍五入到小数点后 5 位时,它会失败。 我正在做:
result2 = Math::Round(result, 5)
但是result2
始终是0.006000000000001
。 我究竟做错了什么?
I am getting a weird problem while parsing a double value in managed C++. It may be that I am doing something wrong. When I do:
double value = 0.006;
result = Math::Parse( value)
The output of result is 0.006000000000001
. Why it is appending a 1?
Also when I go an round the value to 5 decimal places, it fails. I am doing:
result2 = Math::Round(result, 5)
But result2
is always 0.006000000000001
. What am I doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
双精度数字本质上是近似值,并且经常有无法消除的尾部 - 即没有办法更准确地表达数字。
如果您使用
decimal
,您可能会得到更像您预期的结果 - 这仍然是一个近似值,但它使用以 10 为基数,因此往往表现得更接近人们的预期。 但由于它不映射到 CPU 类型,因此速度较慢。double precision numbers are essentially approximations, and frequently have tails that you cannot get rid of - i.e. there is no way of expressing the number more accurately.
You might get results more like you expect if you use
decimal
- which is still an approximation, but it uses base-10, so tends to behave more like people expect. But because it doesn't map to a CPU type, it is slower.这是正常的。 这个问题是由 IEEE 格式的 double - 实际上 0.006 表示为无限二进制分数的近似值引起的。
所以你有3种方法 -
It is normal. This problem caused by IEEE format of double - in real 0.006 is represented as approximation of infinite binary fraction.
So you have 3 ways -
这是由于精度。 我在此处给出了这个答案:
This is due to precision. I gave this answer here: