1

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

4

2 に答える 2

6

まず第一に、0.1それを表現する正確な方法がないため、バイナリ浮動小数点の最悪の敵です。2 進浮動小数点では正確に表現できない小数点数がたくさんあります。この場合、ループを次のように調整できます。

for($i = 50; $i > 0; $i = $i - 1){
  echo $i / 10.0 . '<br>';
}
于 2013-06-13T16:52:50.223 に答える
1

これはfloating point precisionPHP に関係していますが、最後の反復でこの正確な結果が生じる原因はわかりません。

それでも、出力を正しく表示したい場合:

printf('%f', $i);
于 2013-06-13T17:10:23.460 に答える