Foros del Web » Programando para Internet » PHP »

¿Incongruencia o bug al usar bucles for?

Estas en el tema de ¿Incongruencia o bug al usar bucles for? en el foro de PHP en Foros del Web. Llevo años trabajando con PHP y JAMÁS (incomprensiblemente) se me había planteado algo parecido. No sé si será una tontería, pero si pongo esto: Código: ...
  #1 (permalink)  
Antiguo 03/06/2008, 08:54
Avatar de qwerty_wq  
Fecha de Ingreso: enero-2005
Mensajes: 109
Antigüedad: 19 años, 3 meses
Puntos: 1
¿Incongruencia o bug al usar bucles for?

Llevo años trabajando con PHP y JAMÁS (incomprensiblemente) se me había planteado algo parecido. No sé si será una tontería, pero si pongo esto:

Código:
for ($i = 0.14; $i <= 0.16; $i += 0.01) {
    echo $i . '<br />';
}
La salida es:

Código:
0.14
0.15
Pero si pongo esto:

Código:
for ($i = 1; $i <= 5; $i += 1) {
    echo $i . '<br />';
}
La salida es:

Código:
1
2
3
4
5
¿Soy yo, o en el primer ejemplo la salida correcta debería ser...?

Código:
0.14
0.15
0.16
Se trata de PHP 5.2.3 y la verdad es me parece ilógico.

Saludos.
  #2 (permalink)  
Antiguo 03/06/2008, 09:07
Avatar de jmlagarto  
Fecha de Ingreso: junio-2008
Ubicación: Castelldefels
Mensajes: 14
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: ¿Incongruencia o bug al usar bucles for?

Debería ser como tu dices, pero en todo caso puedes hacer el bucle con numeros enteros y luego al mostrarlo haces la división, así seguro que no da error.
  #3 (permalink)  
Antiguo 03/06/2008, 09:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ¿Incongruencia o bug al usar bucles for?

Hola qwerty_wq,

El problema viene al comparar números de punto flotante, si necesitas una precisión así de exacta, te recomiendo veas la librería BC Math.

Saludos.
  #4 (permalink)  
Antiguo 03/06/2008, 09:57
Avatar de qwerty_wq  
Fecha de Ingreso: enero-2005
Mensajes: 109
Antigüedad: 19 años, 3 meses
Puntos: 1
Respuesta: ¿Incongruencia o bug al usar bucles for?

Muchas gracias por las respuestas, que confirman que no me he vuelto loco, al menos en lo que respecta a este asunto

La verdad es que esto es un "error" garrafal de PHP (¡en su versión 5!), porque la precisión necesaria no es tanta si uno se para a pensar, ya que si los flotantes que pongo se interpretan como tantos por uno, una variación de 0.014 a 0.015 implica un 0,1% de diferencia, que no es tanto, y no tenemos más que ver su aplicación en estadísticas, indicadores económicos y mil cosas más.

Un saludo.
  #5 (permalink)  
Antiguo 03/06/2008, 10:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ¿Incongruencia o bug al usar bucles for?

Hola qwerty_wq,

Es por eso que PHP tiene la librería BCMath y una librería para estadísticas, sirven para hacer operaciones que los números de punto flotante tienen limitaciones.

Prueba este código si quieres hacer el rango por ejemplo:
Código PHP:
$rango range0.0140.0160.001 );
var_dump$rango ); 
Saludos.
  #6 (permalink)  
Antiguo 03/06/2008, 10:52
Avatar de qwerty_wq  
Fecha de Ingreso: enero-2005
Mensajes: 109
Antigüedad: 19 años, 3 meses
Puntos: 1
Respuesta: ¿Incongruencia o bug al usar bucles for?

Gracias por el consejo, GatorV, aunque en ese caso no me vale ya que la función range() tendría que usarla con el tercer parámetro (el paso) y éste se introdujo en PHP 5. Lamentablemente, el código que estoy escribiendo requiere retrocompatibilidad con PHP 4, así que la opción como dije no me sirve.

Creo que lo más simple es multiplicar por 100 o 1000 los parámetros del bucle for y luego dividirlos por la misma cantidad en su interior asignando el valor a otra variable, tal y como apuntaba jmlagarto.

Muchas gracias por todo!!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:38.