Autor Zpráva
joe
Profil
Ahoj, dlouho jsem s takovým problémem nesetkal, ale dostal jsem se do situace, kdy porovnáván dvě čísla - float.

PHP mi na dvě čísla při var_dump() vrátí float 50.0299022, pokud je ale porovnám === (nebo jen ==), pak vrátí FALSE. Nerozumím tomu. Možná je někde problém s tím, že jedno z čísel má nějakou odchylku jako třeba 0.0000001 apod., ale to bych ji pak viděl při dumpu nebo se ořízne i tam?

Otázka je, jak tedy ta čísla porovnat, zda jsou "stejná" :-) Díky


Tak jsem si poradil přes bccomp(), ale zarazilo mě, že mi var_dump() ukáže stejné hodnoty, které přitom stejné nejsou...
Keeehi
Profil
joe:
Ale fuj, porovávat to jako string. Standardně se to dělá zjištěním, zda jejich rozdíl je menší než nějaká mez pod kterou je považuji za stejné
if (abs($a - $b) < 0.0000001) {
    // $a a $b jsou stejná
}
Ono to dělá víceméně to samé jen to zůstává stále ve floatech.

A na závěr poznámka, proč čísla ve floatu nemusí být stejná, i když jejich výpis být stejný může. Kromě jiného je to dáno převodem mezi soustavami. Zapsat desetinné číslo binárně není tak jednoduché, jak by se mohlo zdát. Když má desetinné číslo v dekadické soustavě ukončený desetinný rozvoj, tak to samé číslo v binární soustavě může mít nekonečný desetinný rozvoj. Takže se musí samozřejmě zaokrouhlovat. Funguje to taky opačně. Dvě různá desetinná čísla v binární soustavě mohou mít neukončený desetinný rozvoj v desítkové soustavě. Aby je tedy bylo možné vypsat, musejí se zaokrouhlit. Pak se zdají, že jsou stejná, ovšem ve skutečnosti se o trochu liší. Vlivem této zaokrouhlovací chyby se klidně může stát, že třeba čísla 0.1 a 0.2 si mohou být více podobná než 0.1 a 0.1.
joe
Profil
Keeehi:
Díky, to mě v tuto chvíli nenapadlo, opravil jsem, samozřejmě jde o lepší řešení. Dávat to jako string se mi taky nelíbilo, ale našel jsem to jako tip při hledání.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: