2011-11-07 15 views
5

mam dla pętli jak poniżejNa pętli nie działa dla liczb rzeczywistych

<?php 

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

echo $i."<br>"; 
} 

?> 

ten kod wypisuje wartość i till 9.6 nie 10.

dlatego zwraca wartość I = 10 w końcu.

+2

Popełniłeś błąd, '$ i + 0.4' to prawdopodobnie' $ i + = 0.4', ponieważ powiedziałeś, że idzie do 9.6, renderując 3 odpowiedzi poniżej nieprawidłowe. –

Odpowiedz

2

Użyj +=, aby zwiększyć wartość, zamiast tylko plusa. Tak jak teraz jest dla mnie nieskończoną pętlą.

Edycja: Z jakiegoś powodu PHP nie działa poprawnie z różnymi typami w pętlach.

poniżej to powinno działać

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

oto 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) 

To chyba auto odlewania PHP robi, że jest przyczyną tego

+0

dlaczego nie drukuje 10. pytam tylko o to. Please – manishjangir

+0

Nie rozwiązanie. –

+0

@RokKralj Teraz rozwiązanie. – Mob

3

ponieważ reprezentowania liczb zmiennoprzecinkowych dla maszyn - http://en.wikipedia.org/wiki/Floating_point

Zalecam stosowanie indeksów całkowitych dla pętli

+0

+1. Ale używanie indeksów całkowitych nie zawsze jest możliwe. W takich przypadkach musisz użyć wartości epsilon - np. dozwolony błąd. Zobacz moją odpowiedź. –

2

Występuje problem z dokładnym porównaniem FLOAT (które ma miejsce w < =).

Czy to tak:

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

Można zrobić:

<?php 

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

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

?> 

wynik tutaj: http://codepad.org/CxvzEUeq

+0

ale faktycznie mam dwie wartości, jedna to $ start, a druga to $ end. te wartości mogą być dowolnymi rzeczami, takimi jak float lub int. więc moja pętla for będzie podobna do ($ i = $ start; $ <= $ end; $ i = +. 4) – manishjangir

+0

Daje to problem podczas porównywania, jak sugeruje inna odpowiedź –

+0

@ user1031816: Dodałem kolejną odpowiedź, która pokazuje, w jaki sposób rzecz powinna być zrobiona. Z wartością epsilon. –

0

Porównując, trzeba użyć wartości epsilon, co oznacza dozwolony błąd podczas porównywania wartości zmiennoprzecinkowych.

$epsilon=0.000001; //a very small number 

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

Dla dokładnego porównania można zaokrąglić te wartości, gdyż jak po ...

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

}

?>

jeśli u umieścić ja < = 10 wtedy będzie kontynuować drukowanie na wartość 10, ale jeśli usuń = podpisać następnie zatrzyma się na 9!

Powiązane problemy