0

可能重复:
浮点不准确示例

我在 C/C++ 中的 WHILE 循环中有以下行:

while(...)
{
    x = x + float(0.1); // x is a float type. Is the cast necessary?
}

x 从 0 开始。问题是,在我的第一个循环之后,x = 0.1。这很酷。在我的第二个循环之后,x = 0.2。那真好;那真甜。但是,在我的第三个循环之后,x = 0.3000001。那不行。我希望它的值为 0.3,而不是 0.3000001。可以做到吗?我循环错误吗?

4

5 回答 5

3

浮点不是那样工作的,在任何两个实数之间有无限多个实数,并且只有有限数量的位,这意味着在几乎所有情况下,浮点表示都是近似的。阅读此链接了解更多信息。

于 2013-01-16T14:59:28.310 回答
1

像这样的代码:

for (int i = 0;… ; ++i)
{
    float x = i / 10.f;
    …
}

将导致x每次迭代中的float值是最接近 i/10 的值。它通常不会是精确的,因为 i/10 的精确值通常无法在float.

对于double,将定义更改为:

    double x = i / 10.;

这将导致更精细的x,因此它通常会更接近 i/10。但是,它通常仍然不会完全是 i/10。

如果您确实需要 i/10,则应进一步解释您的要求。

于 2013-01-16T15:07:18.057 回答
1

这不是循环,而是浮点数在内存中的表示方式。您不会期望所有实数都可以直接用有限的字节数表示,对吧?

A0.3不能完全由 a 表示float。尝试 a double(不是说它会起作用,它可能不会,但偏移量会更低)。

于 2013-01-16T14:59:03.047 回答
1

这是对浮点数的常见误解。0.3可能无法用 32 位或 64 位二进制浮点精确表示。很多数字不能完全表示。忽略不必要的语法,您的循环运行良好。

while (...)
{
    x += 0.1f; /* this will do just fine in C++ and C */
}

如果这没有意义,请考虑存在无限数量的浮点数的事实......只有有限数量的位来描述它们。

无论哪种方式,如果您需要精确的结果,您需要使用适当精度的小数类型。不过好消息是,除非您在计算金钱,否则您可能不需要精确的结果(即使您认为自己需要)。

于 2013-01-16T15:01:00.003 回答
0

在这种情况下不需要演员表

float x;
x = x + float(0.1);

你可以简单地写

x+= 0.1
于 2013-01-16T14:58:53.017 回答