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

Vol*_*ort -5 c++ floating-point

for (float x = 0.00; x < 1.00; x += 0.01) {
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

我预计

0.00
0.01
0.02
...
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到 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
Run Code Online (Sandbox Code Playgroud)

那部分怎么了?为什么所有额外的9s?

Jos*_*eld 8

请阅读每个计算机科学家应该知道的关于浮点运算的内容.

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

00111111 01010111 00001010 00111101
Run Code Online (Sandbox Code Playgroud)

实际上,即使0.01不能完全表示float,因此每次添加此值时x,您的期望变得越来越不精确.您可以通过使用ints来避免这种情况,如下所示:

for (int x = 0; x < 100; x += 1) {
    cout << (x / 100.0f) << endl;
}
Run Code Online (Sandbox Code Playgroud)

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