2011-11-07 14 views
5

Ho un ciclo for come sottociclo non è in esecuzione per galleggiare valori

<?php 

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

echo $i."<br>"; 
} 

?> 

questo codice stampa il valore dei dissodo 9.6 non 10.

perché restituisce il valore di i = 10 alla fine.

+2

Hai fatto un errore, '$ i + 0.4' era probabilmente' $ i + = 0.4', dato che hai detto che saliva fino a 9.6, rendendo 3 risposte sotto non valide. –

risposta

2

Utilizzare += per incrementarlo, anziché solo più. Come è ora, è un loop infinito per me.

Modifica: per qualche motivo PHP non funziona correttamente con diversi tipi di loop.

Questa qui sotto dovrebbe funzionare

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

Ecco il 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) 

Questo è probabilmente il PHP auto-fusione sta facendo che sta causando questo

+0

perché non sta stampando 10. Sto solo chiedendo questo.per favore, – manishjangir

+0

Non è una soluzione. –

+0

@RokKralj Ora una soluzione. – Mob

3

a causa di rappresentanza di numeri float per macchine - http://en.wikipedia.org/wiki/Floating_point

Si consiglia di utilizzare gli indici interi per i loop

+0

+1. Ma l'uso di indici interi non è sempre possibile. In questi casi devi usare il valore epsilon - ad es. l'errore consentito. Vedi la mia risposta. –

2

C'è un problema con il confronto accurato FLOAT (che si svolge in =).

fare in questo modo:

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

si potrebbe fare:

<?php 

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

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

?> 

risultato qui: http://codepad.org/CxvzEUeq

+0

ma in realtà ho due valori uno è $ start e il secondo è $ end. questi valori possono essere qualsiasi cosa come float o int. quindi il mio ciclo for sarà come per ($ i = $ start; $ <= $ end; $ i = +. 4) – manishjangir

+0

Questo dà problemi quando si effettua il confronto come suggerito in un'altra risposta –

+0

@ user1031816: Ho postato un altro risposta, che mostra come dovrebbe essere fatta la cosa. Con valore epsilon. –

0

Quando si confrontano, si deve utilizzare il valore Epsilon, che denota il permesso errore quando si confrontano i valori float.

$epsilon=0.000001; //a very small number 

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

Per fare un confronto esatto si può arrotondare quelle valore, quanto come seguire ...

<?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>";

}

?>

se u mettere i < = 10 allora continuerò la stampa a valore 10, ma se remove = firmare allora si fermerà alle 9!