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

Il risultato che desidero è:Perché ciò si interrompe prima di raggiungere il valore previsto?

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 

Cosa succede invece è il ciclo raggiunge 1.9 e si ferma. Perché?

+4

@Brad, grazie per la pulizia che fino. Hai reso questa domanda molto più leggibile e recuperabile. +1 alla domanda! Forse dovremmo guardare tutti più da vicino a una domanda prima di votarla, poiché abbiamo sicuramente il potere di girarla. – jmort253

risposta

0

Questo non funziona a causa di precisione in virgola mobile. I numeri sono memorizzati nel formato base 2 e non sono mai esatti a causa dell'arrotondamento. Quando aggiungi .1 a 1.9, non si finisce con 2.0. Finisci con qualcosa come 1.99999. Alla prossima iterazione si finirebbe con qualcosa come 2.099998 a seconda di ciò che arrotonda in formato base 2.

Per ulteriori informazioni vedere Floating point numbers e Double-precision floating-point format

Si potrebbe anche fare qualcosa di simile per ottenere il risultato che siete dopo

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

Questo è ciò che chiamo ghetto. – Strawberry

+0

la domanda era "perché non funziona", quindi qualche spiegazione sui punti in virgola mobile oltre al codice avrebbe ottenuto voti positivi. – Spudley

+0

Grazie, ora lo capisco! – Jelly

5

Perché, non potrà mai raggiungere floating point == integer

+0

+1 Esattamente. Se vuoi che funzioni, devi controllare se == 2.0 – EmmanuelG

0

si può fare:

for($i=0;$i<=20;$i+=1){ 
    echo ($i/10)."<br>"; 
}