Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] IF, less or equal, nie działa :/
Tryllion
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 29.07.2009

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


Witam

Mam taki kod i nie rozumiem co może być źle, jak znaleźć error (IMG:style_emoticons/default/sciana.gif)

  1. IF( $val == $row->v ) {
  2. echo ' TAK';
  3. continue;
  4. }
  5. echo 'NIE'; continue;

ten if jest wywoływany w pętli while, nie rozumiem dlaczego ale czasem liczby o przecinkowej precyzji wcale nie są wykrywane jako równe (IMG:style_emoticons/default/exclamation.gif) !
Co może być tego przyczyną ? Czy to nie są wartości typu int tylko String np. jak to sprawdzić, co może być źle ?

proszę o wskazówki bo naprawdę nie rozumiem
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




O błędzie w składni if-else nie piszę bo to już wytknięto. Co do liczb zmiennoprzecinkowych to niestety z porównywaniem ich trzeba mocno uważać. O ile nie są to jakieś, nazwijmy to, proste w stylu 0.5 czy mające ciut więcej miejsc po przecinku, to już porównywanie wyników bardziej skomplikowanych wyrażeń może dawać nierówne wartości z racji określonej dokładności liczb, a w związku z tym przy działaniach zachodzą co i rusz zaokrąglenia. Im ich więcej, tym większa szansa, że porównanie zakończy się jako FALSE. Dobrym przykładem by to zobrazować może być popularne:
1/9 * 9
Jak wiadomo 1/9 daje w zapisie dziesiętnym 0.11111111111111111111111111
przemnożenie przez 9 da więc:
0.9999999999999999999
a nie jak nakazuje matematyka 1 i takie właśnie pułapki czekają na programistów co i rusz w związku z zaokrągleniami i przybliżeniami.

EDIT: To co podałem jest proste i kompy takie trywialne przypadki zazwyczaj wyłapują, więc 1 ostatecznie wychodzi, chociaż wynika to z przekształceń wyrażeń arytmetycznych na niskim poziomie. Dzielenie jest zamieniane zazwyczaj na mnożenie przez odwrotność (ale to też zależy od choćby obecności koprocesora), ale o tym możesz nie wiedzieć, bo nie każdy programista musi znać architekturę komputerową włącznie z budową procesora i operacjami prze niego wykonywanymi (IMG:style_emoticons/default/smile.gif) To miał być tylko przykład ilustrujący ideę, która leży u podstaw opisanego przez Ciebie błędu.

Ten post edytował thek 28.10.2009, 21:09:09
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 13.10.2025 - 23:55