对于使用float作为计数器的循环,增加0.01,不会打印预期的浮点值

时间:2013-04-20 19:02:06

标签: c++ floating-point

for (float x = 0.00; x < 1.00; x += 0.01) {
    cout << x << endl;
}

我希望

0.00
0.01
0.02
...

它工作正常,直到 0.83

...
0.81
0.82
0.83
0.839999
0.849999
0.859999
0.869999
0.879999
0.889999
0.899999
0.909999
0.919999
0.929999
0.939999
0.949999
0.959999
0.969999
0.979999
0.989999
0.999999

该部分的内容是什么?为什么所有额外的9 s?

1 个答案:

答案 0 :(得分:8)

请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

浮点类型不能代表每个可能的数值。他们有一些不精确。与0.84最接近的可表示IEEE754单精度浮点值为0.839999973773956298828125。这比0.84少一点。如您所见,打印时,显示为0.839999。这个数字的二进制表示是:

00111111 01010111 00001010 00111101

事实上,即使0.01float无法正确表达,因此每次将此值添加到x时,您的期望都会越来越不准确。您可以使用int来避免这种情况,例如:

for (int x = 0; x < 100; x += 1) {
    cout << (x / 100.0f) << endl;
}

但是,在执行除法后,它打印的许多值仍然无法表示。如果你根本不能处理不精确,你必须简单地不使用浮点值。将您的值存储为int,并将其解释为表示相应的除以float值。