PHP异常/奇怪的行为

mes*_*600 3 php floating-point

当我跑:

for($o=1;$o<=655;$o++){ $r = $r+0.01; echo $r." ";}

在某些时候,我得到:

...4.29 4.3 4.31 4.32 4.33 4.34 4.35 4.36 4.37 4.38 4.39 4.4
4.41 4.42 4.4299999999999 4.4399999999999 4.4499999999999
4.4599999999999 4.4699999999999 ...
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时:

for($o=1;$o<=5;$o+=0.01){ echo $o." "; }

异常开始于:

4.34 4.35 4.36 4.37 4.38 4.3899999999999 4.3999999999999
Run Code Online (Sandbox Code Playgroud)

为什么添加是for循环的一部分,或者在for循环中有什么区别?

Joh*_*ohn 5

欢迎来到舍入错误的奇迹.

0.01并不能完全表示为有限二进制分数,因此如果将其重复添加到另一个浮点数,最终会得到舍入误差.

您看到舍入误差的具体点取决于所涉及数字的二进制展开如何产生舍入误差.