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