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

El resultado que deseo es:¿Por qué se detiene este ciclo antes de alcanzar el valor deseado?

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 

Lo que sucede en cambio, es el bucle alcanza 1.9 y se detiene. ¿Por qué?

+4

@Brad, gracias por la limpieza de eso. Hiciste esta pregunta mucho más legible y rescatable. +1 a la pregunta! Quizás deberíamos mirar más de cerca una pregunta antes de votarla, ya que definitivamente tenemos el poder de cambiarla. – jmort253

Respuesta

0

Esto no funciona debido a la precisión de punto flotante. Los números se almacenan en formato base 2 y nunca son exactos debido al redondeo. Cuando agrega .1 a 1.9, no termina con 2.0. Terminas con algo como 1.99999. En la próxima iteración terminaría con algo así como 2.099998 dependiendo de a qué redondea en formato base 2.

Para más información vea Floating point numbers y Double-precision floating-point format

También podría hacer algo como esto para conseguir el resultado que está después

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

Eso es lo que yo llamo gueto. – Strawberry

+0

la pregunta era "¿por qué no funciona?", Por lo que algunas explicaciones acerca de los puntos flotantes además del código te hubieran dado un voto favorable. – Spudley

+0

¡Gracias, ahora lo entiendo! – Jelly

5

Porque, nunca logrará floating point == integer

+0

+1 Exactamente. Si quieres que esto funcione, debes verificar si == 2.0 – EmmanuelG

0

Se puede hacer por:

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