2011-11-07 15 views
5

Tengo un bucle, como a continuaciónbucle no se está ejecutando para valores flotantes

<?php 

for($i=0;$i<=10;$i+0.4){ 

echo $i."<br>"; 
} 

?> 

este código imprime el valor de i Hasta 9.6 No 10.

por lo que devuelve el valor de i = 10 Al final.

+2

Cometió un error, '$ i + 0.4' probablemente era' $ i + = 0.4', ya que dijo que sube hasta 9.6, lo que hace que 3 respuestas sean inválidas a continuación. –

Respuesta

2

Use += para incrementarlo, en lugar de simplemente aumentar. Como es ahora, es un ciclo infinito para mí.

Editar: Por alguna razón, PHP no funciona correctamente con diferentes tipos de bucles.

continuación Esto debería funcionar

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

Aquí está la var_dump

int(0) 

float(0.4) 

float(0.8) 

float(1.2) 

float(1.6) 

int(2) 

float(2.4) 

float(2.8) 

float(3.2) 

float(3.6) 

int(4) 

float(4.4) 

float(4.8) 

float(5.2) 

float(5.6) 

int(6) 

float(6.4) 

float(6.8) 

float(7.2) 

float(7.6) 

int(8) 

float(8.4) 

float(8.8) 

float(9.2) 

float(9.6) 

int(10) 

Eso es probablemente el PHP auto-bastidor está haciendo que está causando esto

+0

por qué no está imprimiendo 10. solo estoy pidiendo esto. Por favor – manishjangir

+0

No es una solución. –

+0

@RokKralj Ahora una solución. – Mob

3

debido a que representa de números flotantes para máquinas - http://en.wikipedia.org/wiki/Floating_point

Recomendaría utilizar índices enteros para los bucles

+0

+1. Pero el uso de índices enteros no siempre es posible. En esos casos, debe usar el valor épsilon, p. el error permitido Ver mi respuesta –

2

Existe un problema con la comparación precisa de FLOAT (que tiene lugar en < =).

hacerlo de esta manera:

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

que podría hacer:

<?php 

for($i=0;$i<=100;$i += 4){ 

echo ($i/10)."<br>"; 
} 

?> 

resultado aquí: http://codepad.org/CxvzEUeq

+0

pero en realidad tengo dos valores, uno es $ start y el segundo es $ end. estos valores pueden ser cualquier cosa como float o int. entonces mi bucle for será como para ($ i = $ start; $ <= $ end; $ i = +. 4) – manishjangir

+0

Esto da problema cuando haces la comparación como se sugiere en otra respuesta –

+0

@ user1031816: He publicado otra respuesta, que muestra cómo debe hacerse la cosa. Con el valor epsilon. –

0

Al comparar, usted tiene que utilizar el valor épsilon, que denota el permitido error al comparar los valores de flotación.

$epsilon=0.000001; //a very small number 

for($i=0; $i<10 or abs($i-10)<$epsilon; $i+=0.4){ 
    echo $i."<br>"; 
} 
1

Para la comparación exacta se puede redondear los valores, medida como la siguiente ...

<?php 

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

?> 
1

<?php

for($i=0;$i<10;$i+0.4){

echo $i."<br>";

}

?>

si u poner i = 10 < después seguirá la impresión de valorar 10 pero si remove = firmar a continuación, se detendrá a las 9!

Cuestiones relacionadas