Autor Zpráva
visionic
Profil *
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
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
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++)
není třeba kanón na vrabce a postačil by stávající přístup. Na operace s např. GPS souřadnicemi ve formátu D.dddddddd už ano. Snad by se svět nezbořil.
M02
Profil *
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
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 *
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 *
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
Řeší se to třeba takto:
$bar = 56 / 0.56;
$zero = 100 - $bar;
if (abs($zero) < 0.0000000000001) {
    $zero = 0;
}

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:

0