增加浮动值

时间:2013-01-16 14:57:31

标签: c++ c floating-accuracy

  

可能重复:
  Floating point inaccuracy examples

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

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。可以吗?我错误地循环了吗?

5 个答案:

答案 0 :(得分:3)

浮点不起作用,在任何两个实数之间存在无限多个实数,并且只有有限数量的位,这意味着在几乎所有情况下浮点表示都是近似的。有关详细信息,请阅读此link

答案 1 :(得分:1)

这不是循环,而是浮点数在内存中的表现方式。您不希望所有实数在有限的字节数内直接表示,对吗?

0.3无法准确表示float。试试double(不是说它会起作用,它可能不会,但偏移会更低)。

答案 2 :(得分:1)

这是浮点数的常见误解。 {32}或64位二进制浮点可能无法准确表示0.3。很多数字并不完全可以表示。你的循环工作正常,忽略了不必要的语法。

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

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

无论哪种方式,如果您需要精确结果,您需要使用适当精度的十进制类型。好消息,unless you're doing calculations on money you likely do not need exact results(即使你认为你这样做)。

答案 3 :(得分:1)

这样的代码:

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

将导致每次迭代中x的值为最接近i / 10的float值。它通常不准确,因为i / 10的确切值通常在float中无法表示。

对于double,请将定义更改为:

    double x = i / 10.;

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

如果您完全需要i / 10,您应该进一步解释您的要求。

答案 4 :(得分:0)

在这种情况下不需要演员

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

你可以简单地写

x+= 0.1