Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] for+if
Forum PHP.pl > Forum > Przedszkole
Theos
Mam taki problem, pewnie prosty, ale nie wiem co jest źle zrobione. Niby przechodzi mi przez całą pętle for, ale nie wchodzi do warunku if.

  1. for ($i=1; $i<5; $i=$i+0.1) {
  2. if($i == 3){
  3. echo "Rowne 3";
  4. }
  5. }
nospor
Tak bywa gdy operuje się na liczbach rzeczywistych
if(((int)$i) == 3){
Theos
Jest to jakiś krok do przodu, ale teraz dla i= 3, 3.1, .. , 3.9 jest spełnione. A mi zależy, żeby tylko dla i=3 było spełnione.
mortus
@nospor Rzutowanie w ten sposób nie zadziała, albo raczej zadziała zbyt dobrze, bo dla 3.1, 3.2 itd. również. Problemem jest precyzja liczb zmiennoprzecinkowych, a rozwiązaniem może być funkcja number_format():
  1. if(number_format($i, 1) == number_format(3, 1)) {
  2. echo 'Rowne 3!';
  3. }

Rzutowanie w drugą stronę również nie przyniesie rezultatu, bo z (float) 3 otrzymamy po prostu 3. Natomiast od naszego $i będzie się to różnić na 15 miejscu po przecinku. Operacje na liczbach zmiennoprzecinkowych zawsze są obarczone błędem precyzji.
Theos
Dzięki: +1 pomógł dla Ciebie.
Crozin
Liczb zmiennoprzecinkowych nigdy nie powinno się porównywać operatorem równości (==). Liczby te operują na przybliżeniach, a nie precyzyjnych wartościach. Do poczytania Comparing floating point numbers.
vvolv
Ewentualnie dwa warunki
  1. if($i > 2.9 && $i < 3.1)


Nie trzeba zaprzęgać żadnych dodatkowych funkcji, a do Twoich potrzeb spokojnie wystarczy
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.