2012-05-12 2 views
5
for($i=0;$i<=2;$i+=0.1){ 
    echo $i."<br>"; 
} 

結果は次のとおりです。代わりに、何が起こる目的の値に達する前にループ停止するのはなぜですか?私が望む

0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1 
1.1 
1.2 
1.3 
1.4 
1.5 
1.6 
1.7 
1.8 
1.9 
2 

は、ループが1.9に到達して停止しています。どうして?

+4

@Brad後にそれをクリーンアップするためのおかげである結果を得るために、このような何かを行うことができFloating point numbersDouble-precision floating-point format

を参照してください。あなたはこの質問をもっと読みやすく、救済できるものにしました。質問に+1してください!おそらく、私たちは間違いなくそれを回す力を持っているので、それを投票する前に、より詳細に質問を見るべきでしょう。 – jmort253

答えて

0

を。数値は基数2形式で格納され、決して丸められないため正確ではありません。 .1を1.9に追加すると、2.0に終わることはありません。あなたは1.99999のようなものになります。次の反復では、基本2形式で何を丸めるかによって、2.099998のようなものになります。詳細については

はまた、あなたは、

for ($i = 0; $i < 2.1; $i += .1){ 
    echo $i . '<br />'; 
} 
+0

をチェックする必要があります。それが私がゲットーと呼ぶものです。 – Strawberry

+0

質問は「なぜ動作しないのですか」ということでしたので、コードに加えて浮動小数点についての説明があれば、あなたは賞賛を得ることができました。 – Spudley

+0

ありがとう、今私はそれを理解する! – Jelly

5

それはあなたがで行うことができますfloating point == integer

+0

+1正確に。これを動作させたい場合は、== 2.0 – EmmanuelG

0

達成することはありません、ので:これが原因浮動小数点精度に動作しません

for($i=0;$i<=20;$i+=1){ 
    echo ($i/10)."<br>"; 
} 
関連する問題