为什么我的for循环功能不像我期望的那样?

时间:2013-06-13 16:48:37

标签: php for-loop floating-accuracy

我无法从for循环中找到以下输出的共鸣。

for loop

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之前

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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

printf('%f', $i);