为什么我的for循环函数不像我期望的那样?


Why doesn't my for loop function as I expect?

我找不到以下for循环输出的原因。

for循环

for($i=5; $i>0; $i=$i-.1){
echo $i.'<br>';
}

结果是,

5
4.9
4.8
4.7
4.6
4.5
4.4
4.3
4.2
4.1
4
3.9
3.8
3.7
3.6
3.5
3.4
3.3
3.2
3.1
3
2.9
2.8
2.7
2.6
2.5
2.4
2.3
2.2
2.1
2
1.9
1.8
1.7
1.6
1.5
1.4
1.3
1.2
1.1
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
1.0269562977783E-15

为什么打印1.0269562977783E-15?对我来说应该在0之前也就是在.1之后

首先,0.1是二进制浮点数最大的敌人,因为没有准确的方法来表示它。有许多小数点数不能用二进制浮点数精确表示。在本例中,您可以将循环调整为

for($i = 50; $i > 0; $i = $i - 1){
  echo $i / 10.0 . '<br>';
}

这与PHP中的floating point precision有关,但我不知道是什么导致了最后一次迭代的确切结果。

但是,如果您想正确显示输出:

printf('%f', $i);