Autor Zpráva
LukasPHP
Profil *
Dobry den,
mam nasledujici jednoduchou funkci, kde se stazim prevest varchar na float.
Bohuzel mi to nevraci spravne cisla nevite prosim kde delam chybu?
Diky Luk
MySQL
CREATE DEFINER=`root`@`localhost` FUNCTION `test`() RETURNS float
BEGIN
    DECLARE vystup FLOAT;   
    SET vystup =  cast("50.5596781507" as  DECIMAL(13,10));
    RETURN vystup;
END

Dotaz:
SELECT `test`() AS `test`;
Vystup:
50.55967712402344
Spravne by melo byt ale:
50.5596781507
juriad
Profil
číslo 50.5596781507 nejde vyjádřit v datovém typu FLOAT, z toho důvodu se zaokrouhlilo na nejbližší bližší, což je 50.55967712402344
Pokud chceš docílit větší přesnosti, použij DOUBLE. Pokud ani ten nebude stačit, použij DECIMAL
FLOAT a DOUBLE převedou číslo do dvojkové soustavy a nějak (podle standardu IEEE754) ho ukládají a počítají s ním. Tyto typy mají omezenou velikost a tedy omezenou přesnost.
DECIMAL naopak umí reprezentovat libovolné desetinné číslo přesně za cenu výkonu a velikosti. V PHP neexistuje přímá obdoba DECIMAL; lze ji emulovat pomocí BC a dalších knihoven.

Více o datových typech: http://dev.mysql.com/doc/refman/5.0/en/floating-point-types.html
Úzce to souvisí s Časté potíže, zajímavosti a poučné debaty » Výsledkem výpočtu 1 - 0.9 není přesně 0.1
LukasPHP
Profil *
Dekuji moc za vysvetleni, pouziji tedy decimal.
juriad
Profil
LukasPHP:
Většinou nechceš DECIMAL, protože s ním PHP neumí přímo pracovat. Obvykle stačí DOUBLE, který má přesnost zhruba 16 desetinných míst. Double je také datový typ čísel s desetinnou čárkou v PHP.
Float, který jsi původně použil má oproti Double přesnost přibližně poloviční (to je také důvod, proč se číslo liší na 6. místě za desetinnou čárkou; dvě místa jsou před čárkou).
$cislo = 50.5596781507; # toto je double

K čemu potřebuješ takovou přesnost? Stane se něco, kdybys přišel o jedno nebo dvě desetinná místa?
Vyžaduješ přesné číslo kvůli porovnávání na rovnost? Nestačí, že se hodnoty neliší o více než 0.00000001?
DECIMAL se používá obvykle jen pro ukládání hodnot peněžních částek na místech, kde na tom záleží.
Alphard
Profil
To číslo „50.5596781507“ mi připomíná GPS souřadnici. Vzhledem k tomu, že se tato „správná“ (někdo náhodně klikl na mapu) od té vypočítané hodnoty liší řádově v setinách sekund, což v praxi znamená desetinu metru, mělo by řešení přesnosti smysl možná tak pro katastrální úřad.
Jestli jsem aplikaci GPS neuhádl, berte to jen jako přirovná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: