-5
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?

4

1 回答 1

9

请阅读每个计算机科学家应该了解的关于浮点运算的知识

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

00111111 01010111 00001010 00111101

事实上,even0.01不能完全用 来表示float,所以每次你把这个值加到 上x,你的期望就会变得越来越不精确。您可以通过使用ints 来避免这种情况,如下所示:

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

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

于 2013-04-20T19:05:01.027 回答