1

可能重复:
为什么十进制数不能用二进制精确表示?

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

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

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

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

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

但它没有,而是出现了 0.100000000001 之类的东西。我就像“这到底是什么”

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

4

2 回答 2

5

这是一个数字问题。问题是 1/10 在二进制中是一个无穷长的数字,连续应用除以 10 最终会在每个步骤中对误差求和。要获得更稳定的版本,您应该乘以除数。但请注意:结果也不准确!您可能想用双精度替换浮点数以最小化错误。

unsigned int div = 1;
while(...)
{
    double step = 1.0 / (double)div;
    ....
    div *= 10;
}
于 2011-12-24T06:26:04.547 回答
2

对于二进制浮点运算,除以 10 并不准确,因此您看到的结果与您的预期有些不同。

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

于 2011-12-24T06:20:19.737 回答