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 bccomp() var_dump() ukáže stejné hodnoty, které přitom stejné nejsou...
|
||
Keeehi Profil |
#2 · Zasláno: 16. 2. 2015, 03:18:33
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á } 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 |
#3 · Zasláno: 16. 2. 2015, 03:33:05
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í. |
||
Časová prodleva: 10 let
|
0