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

时间:2009-08-06 12:31:28

标签: .net double precision managed-c++

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

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

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

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

result2 = Math::Round(result, 5)

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

3 个答案:

答案 0 :(得分:3)

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

  

浮动和双打是数字   具有某种特定的表示   精确。不是每个值都可以   以这种格式表示。看到   here也是如此。

     

你可以很容易地想到为什么会这样   是这样的:有一个无限的   在intervall中的号码数量   (1..1),但浮动只有一个限制   代表所有的位数   (-MAXFLOAT..MAXFLOAT)中的数字。

     

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

     

那么为什么一个数字很少   浮点后的数字   受影响?因为代表性   是基于二进制系统而不是   小数点,轻松制作其他数字   然后用小数表示。

答案 1 :(得分:0)

双精度数基本上是近似值,并且经常有无法摆脱的尾部 - 即无法更准确地表达数字。

如果你使用decimal,你可能会得到更像你期望的结果 - 这仍然是一个近似值,但它使用了基数10,所以往往表现得更像人们所期望的。但由于它没有映射到CPU类型,因此速度较慢。

答案 2 :(得分:0)

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

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