托管 C++ 中的 double.Parse 问题

发布于 2024-07-30 05:56:54 字数 374 浏览 7 评论 0原文

我在解析托管 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

已下线请稍等 2024-08-06 05:56:54

双精度数字本质上是近似值,并且经常有无法消除的尾部 - 即没有办法更准确地表达数字。

如果您使用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.

情归归情 2024-08-06 05:56:54

这是正常的。 这个问题是由 IEEE 格式的 double - 实际上 0.006 表示为无限二进制分数的近似值引起的。
所以你有3种方法 -

  • 使用相应的字符串格式来输出
  • 使用 Decimal 类型
  • 不要使用 == 来比较数字,而是使用 < 或> 具有恒定误差,例如:(X -0.06) < 错误

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 -

  • use corresponding string formating to output
  • use Decimal type
  • don't use == to compare numbers, instead use < or > with constant error,e.g: (X -0.06) < Error
情绪操控生活 2024-08-06 05:56:54

这是由于精度。 我在此处给出了这个答案

浮点数和双精度数是数字
具有一定的代表性
精确。 不是每个值都可以
以这种格式表示。 看
此处也是如此。

你很容易想到为什么会这样
是这样的:有无限的
恰好在区间内的数字的个数
(1..1),但浮点数只有有限的
表示全部的位数
(-MAXFLOAT..MAXFLOAT) 中的数字。

更恰当地说:32位整数
表示有一个可数的
要表示的整数个数,
但有无数个
无法计算的实数值的个数
在有限的范围内充分代表
32 或 64 位的表示。
因此不仅有限制
最高和最低可代表
真正的价值,还在于准确性。

那么为什么一个数字几乎没有
浮点数后的数字
做作的? 因为代表
基于二进制系统而不是
小数,很容易变成其他数字
然后表示小数。

This is due to precision. I gave this answer here:

Floats and doubles are number
representations with a certain
precision. Not every value can be
represented in this format. See
here as well.

You can easily think of why this would
be the case: there is an unlimited
number of number just in the intervall
(1..1), but a float only has a limited
number of bits to represent all
numbers in (-MAXFLOAT..MAXFLOAT).

More aptly put: in a 32bit integer
representation there is a countable
number of integers to be represented,
But there is an infinite innumerable
number of real values that cannot be
fully represented in a limited
representation of 32 or 64bit.
Therefore there not only is a limit to
the highest and lowest representable
real value, but also to the accuracy.

So why is a number that has little
digits after the floating point
affected? Because the representation
is based on a binary system instead of
a decimal, making other numbers easily
represented then the decimal ones.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文