Autor | Zpráva | ||
---|---|---|---|
LukasPHP Profil * |
#1 · Zasláno: 8. 3. 2014, 11:05:19
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`; 50.55967712402344 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 * |
#3 · Zasláno: 8. 3. 2014, 16:17:54
Dekuji moc za vysvetleni, pouziji tedy decimal.
|
||
juriad Profil |
#4 · Zasláno: 8. 3. 2014, 16:27:18
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í. |
||
Časová prodleva: 10 let
|
0