在托管C ++中解析double值时,我遇到了一个奇怪的问题。可能是我做错了什么。当我这样做时:
double value = 0.006;
result = Math::Parse( value)
结果的输出为0.006000000000001
。为什么要追加1?
此外,当我将值舍入到5位小数时,它会失败。我在做:
result2 = Math::Round(result, 5)
但result2
总是0.006000000000001
。我做错了什么?
答案 0 :(得分:3)
这是由于精确度。我给出了这个答案here:
浮动和双打是数字 具有某种特定的表示 精确。不是每个值都可以 以这种格式表示。看到 here也是如此。
你可以很容易地想到为什么会这样 是这样的:有一个无限的 在intervall中的号码数量 (1..1),但浮动只有一个限制 代表所有的位数 (-MAXFLOAT..MAXFLOAT)中的数字。
更恰当地说:在一个32位整数 代表有一个可数 要表示的整数数, 但是无数无数 不能的实际值的数量 完全代表有限的 表示32或64位。 因此,不仅有限制 最高和最低代表性 真正的价值,也是准确性。
那么为什么一个数字很少 浮点后的数字 受影响?因为代表性 是基于二进制系统而不是 小数点,轻松制作其他数字 然后用小数表示。
答案 1 :(得分:0)
双精度数基本上是近似值,并且经常有无法摆脱的尾部 - 即无法更准确地表达数字。
如果你使用decimal
,你可能会得到更像你期望的结果 - 这仍然是一个近似值,但它使用了基数10,所以往往表现得更像人们所期望的。但由于它没有映射到CPU类型,因此速度较慢。
答案 2 :(得分:0)
这很正常。由IEEE格式的双重实际0.006引起的这个问题表示为无限二进制分数的近似。 所以你有3种方法 -