Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] for+if
Theos
post 30.08.2011, 14:03:39
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.02.2011

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
nospor
post 30.08.2011, 14:20:16
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tak bywa gdy operuje się na liczbach rzeczywistych
if(((int)$i) == 3){


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Theos
post 30.08.2011, 14:35:06
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.02.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mortus
post 30.08.2011, 14:36:25
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował mortus 30.08.2011, 14:39:18
Go to the top of the page
+Quote Post
Theos
post 30.08.2011, 14:41:05
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.02.2011

Ostrzeżenie: (0%)
-----


Dzięki: +1 pomógł dla Ciebie.
Go to the top of the page
+Quote Post
Crozin
post 30.08.2011, 15:16:22
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
vvolv
post 30.08.2011, 16:38:01
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 5
Dołączył: 31.07.2011

Ostrzeżenie: (0%)
-----


Ewentualnie dwa warunki
  1. if($i > 2.9 && $i < 3.1)


Nie trzeba zaprzęgać żadnych dodatkowych funkcji, a do Twoich potrzeb spokojnie wystarczy
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 18:19