将浮动除以10

时间:2011-12-24 06:16:14

标签: c++ floating-point floating-accuracy inexact-arithmetic

  

可能重复:
  Why can't decimal numbers be represented exactly in binary?

我正在开发一种非常简单的C ++数学使用算法。

我有一个名为“step”的浮点变量,每次我完成一个while循环,我需要将步除以10。

所以我的代码有点像这样,

float step = 1;
while ( ... ){
      //the codes
      step /= 10;
}

在我愚蠢的简单逻辑中,结局很好。步骤将除以10,从1到0.1,从0.1到0.01。

但事实并非如此,而是出现了0.100000000001之类的东西。我就像“什么地狱”

有人可以帮我解决这个问题。这可能是我不完全理解的数据类型本身。因此,如果有人可以进一步解释,我们将不胜感激。

2 个答案:

答案 0 :(得分:5)

这是一个数字问题。问题是1/10是二进制的无穷长数,并且10的除法的连续应用最终会导致每个步骤中的误差相加。要获得更稳定的版本,您应该乘以除数。但要小心:结果也不准确!您可能希望用double替换float以最小化错误。

unsigned int div = 1;
while(...)
{
    double step = 1.0 / (double)div;
    ....
    div *= 10;
}

答案 1 :(得分:2)

十进制除法对于二进制浮点运算不是很精确,因此您会看到与您期望的结果略有不同的结果。

二进制浮点表示为整数比,其中分母是2的幂。由于没有完全等于十分之一的二进制分数,您将看到最接近的可表示数字而不是您期望的数字。