Autor | Zpráva | ||
---|---|---|---|
visionic Profil * |
#1 · Zasláno: 10. 2. 2017, 02:27:07
Dobrý ráno,
nemohu pochopit význam tohoto počítání. $bar = 56 / 0.56; $zero = 100 - $bar; echo $bar; //100 echo $zero; // 1.4210854715202E-14 Proš VAR ZERO vypisuje 1.4210854715202E-14, když má vypsat 0 $bar = 100; $zero = 100 - $bar; echo $bar; //100 echo $zero; //0 |
||
Alphard Profil |
#2 · Zasláno: 10. 2. 2017, 07:30:03
Achjo, už zase :-) Není to chyba PHP, je to vlastnost reprezentace čísel. Viz např. vtm.e15.cz/proc-pocitacum-delaji-problemy-desetinna-cisla.
|
||
Chro. Profil |
#3 · Zasláno: 10. 2. 2017, 11:27:48
Je zajímavé, že v PHP lze přesně počítat s knihovnou BC math, která při výpočtech nepracuje s typem float, ale string. Čekal bych, že tento neduh bude - co se týče nativního počítání v PHP - dávno odstraněn. Takhle se vleče tato pro mě chyba (pro někoho neoddělitelná vlastnost) napříč verzemi.
|
||
pcmanik Profil |
Chro.:
Totižto to počítanie so stringami je značne pomalšie. Na jednom webe rozdiel nemusíš spozorovať, lenže si to predstav z pohľadu hostingu kde na jednom servery ide kľudne 100 a viac stránok a už sa ti vyťaženie značne zvýši. |
||
Chro. Profil |
PHP by mělo automaticky při zpracovávání kódu rozpoznávat, kdy je potřeba pro výpočet použít sofistikovanější metodu. Na běžné
$a+= 3; for ($i = 0; $i < 100; $i++) |
||
M02 Profil * |
#6 · Zasláno: 10. 2. 2017, 12:57:17
Chro.:
Nedělá to tak žádný programovací jazyk, vyjma matematických. Číselné datové typy mají omezenou přesnost, je třeba s tím počítat. |
||
Tomášeek Profil |
#7 · Zasláno: 10. 2. 2017, 13:14:29
Chro.:
„Na operace s např. GPS souřadnicemi ve formátu D.dddddddd už ano.“ GPS souřadnice se typicky (typického zástupce beru Google Maps) bere na nějakých 6, 7 desetinných míst. Chyba v #1 se ale týká až 14. desetinného místa, s menší přesností výpočet vyjde bezproblémově. Další věc, kde se hodí počítat přesně, jsou peníze. Tam se to ale řeší počítáním v haléřích (tedy bez desetinné čárky, která se přidává až k výsledku). |
||
visionic Profil * |
#8 · Zasláno: 10. 2. 2017, 18:52:13
Teorii tedy známe, ale co potom? Jak to řešit? Mám teda použít float? Je zajímavé, jakmile výsledek není 100, tak to počítá bez problémů, třeba například 46 / 0.56, tak výsledek vyjde jak má.
|
||
TomášK. Profil * |
#9 · Zasláno: 10. 2. 2017, 20:37:28
visionic:
Známe-li teorii, není moc co řešit. Použijeme typ, který je pro daný účel vhodný. Pokud je potřeba absolutní přesnost, ne float. Ale reálně s přesností floatu nebudeš mít problém, pokud neděláš nějaké složité výpočty (pro které php stejně není vhodné), je akorát potřeba si pamatovat, že není možné porovnávat floaty na rovnost. |
||
Keeehi Profil |
#10 · Zasláno: 11. 2. 2017, 09:37:31
Řeší se to třeba takto:
$bar = 56 / 0.56; $zero = 100 - $bar; if (abs($zero) < 0.0000000000001) { $zero = 0; } |
||
Časová prodleva: 8 let
|
0