2009-08-06 45 views
1

在解析托管C++中的double值时,我遇到了一个奇怪的问题。这可能是我做错了事。当我这样做时:Managed C++中的double.Parse问题

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

结果的输出是0.006000000000001。为什么要附加1?

此外,当我将值舍入到5位小数时,它失败。我做:

result2 = Math::Round(result, 5) 

result2总是0.006000000000001。我究竟做错了什么?

回答

0

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

  • 使用相应的字符串格式化输出
  • 使用十进制类型
  • 不要用==以恒定的错误,如比较数字,而是使用<或>:( X -0.06)<错误
3

这是由于精度。我给了这个答案here

和双精度浮点数是数 表示具有一定 精度。不是每个值都可以是以这种格式表示的 。同样见 here

你可以很容易想到的为什么会 是这样的:有刚刚在INTERVALL (1..1)无限 数数,而是一个浮动只具有有限 数位来表示的(-MAXFLOAT..MAXFLOAT)中的所有 数字。

更恰当地说:在32位整数 表示有一个可数 数量的整数来表示, 但就是不能 在有限 表示完全代表实际价值的无限无数 号32或64位。 因此,不仅有 的最高和最低可表示 的实际价值的限制,而且还有准确性。

那么为什么一个数字在浮点数 受影响后几乎没有 数字?因为代表 是基于一个二进制系统而不是 一个小数,使其他数字很容易 代表小数。

0

双精度数基本上是近似的,并且经常有问题,你无法摆脱的尾巴 - 即没有更准确地表达数量的方式。

如果您使用decimal - 这仍然是近似值,但它使用的是基数为10,所以您可能会得到更像您期望的结果,因此趋向于更像人们的预期。但是因为它没有映射到CPU类型,所以速度较慢。