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?
答案 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.01
与float
无法正确表达,因此每次将此值添加到x
时,您的期望都会越来越不准确。您可以使用int
来避免这种情况,例如:
for (int x = 0; x < 100; x += 1) {
cout << (x / 100.0f) << endl;
}
但是,在执行除法后,它打印的许多值仍然无法表示。如果你根本不能处理不精确,你必须简单地不使用浮点值。将您的值存储为int
,并将其解释为表示相应的除以float
值。