Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Mysql, php, wedos, presnost vypoctu float

Milan Horník
verified
rating uzivatele
(8 hodnocení)
31. 3. 2020 09:19:39
zdravim,
presouval jsem ted jeden projekt k Wedosu a vyskytla se vec, kterou jsem jiz dlouho nevidel a to ze pri vypoctu v db, se mne vraci ne uplne presne cislo, jedna se o float typ.
napriklad 9 x 7,40 mne vrati jako 66.600000858307 , namisto 66.60.
Predpokladam ze to souvisi nejak s nastavenim db.
Druha vec je ze jsem byl zvykli, ze pokud mam v db ulozenou hodnotu jako napriklad float(10,2) takmne to vysledek vrati na dve desetinna cisla, tady to vraci jen jedno desetinne misto tj misto
7.40 to vraci 7.4
Zajimave je ze pokud pouziju na wedosu jejich phpmyadmin a pustim tam sql pro vypocet tak to zobrazi vysledek spravne tj jak spravny pocet desetinnych mist, tak i presny vysledek.
tj proc se to deje?
31. 3. 2020 09:19:39
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445640
Napsal Milan Hornik;1576619
zdravim,
presouval jsem ted jeden projekt k Wedosu a vyskytla se vec, kterou jsem jiz dlouho nevidel a to ze pri vypoctu v db, se mne vraci ne uplne presne cislo, jedna se o float typ.
napriklad 9 x 7,40 mne vrati jako 66.600000858307 , namisto 66.60.
Predpokladam ze to souvisi nejak s nastavenim db.
Druha vec je ze jsem byl zvykli, ze pokud mam v db ulozenou hodnotu jako napriklad float(10,2) takmne to vysledek vrati na dve desetinna cisla, tady to vraci jen jedno desetinne misto tj misto
7.40 to vraci 7.4
Zajimave je ze pokud pouziju na wedosu jejich phpmyadmin a pustim tam sql pro vypocet tak to zobrazi vysledek spravne tj jak spravny pocet desetinnych mist, tak i presny vysledek.
tj proc se to deje?
Tipnul bych, že to číslo je pořád +- stejné, jen se liší to jak ho různé php nebo různé SW vypisují float může pořád být 66.600000858307, nicméně když ho vypíšete, může ho vypisovací funkce sama zkrátit. Neznám PHP tohle říkám tak obecně jak to většinou funguje.
31. 3. 2020 10:03:54
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445639
zezmen
verified
rating uzivatele
(39 hodnocení)
31. 3. 2020 10:11:28
Proč se tak děje ?
Protože WEDOS !!!
Používej v php konverzi např.
31. 3. 2020 10:11:28
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445638
Milan Horník
verified
rating uzivatele
(8 hodnocení)
31. 3. 2020 10:38:48
tak jsem to presne udelal :)
31. 3. 2020 10:38:48
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445637
jenik1111
verified
rating uzivatele
(6 hodnocení)
31. 3. 2020 10:45:56
obecne float je datovy typ, ktery nereprezentuje hodnoty zcela precizne...napriklad microsoft prirucka (tsql vs mysql rozdily jsou v tomto pripade irelevantni) na to upozornuje napr zde Training Kit (Exam 70-461): Querying Microsoft SQL Server 2012; Autoři: Itzik Ben-Gan, Dejan Sarka, Ron Talmage; ISBN: 978-0-7356-6605-4
Viz screenshot - zakaznik byl prekvapen kdyz reprezentoval carove kody s pomoci float ze nedostava spravne produkty :D https://biportal.cz/wp-content/uploads/2017/05/Capture-27.png
Detaily a duvody urcite najdete v oficialni dokumentaci mysql.
31. 3. 2020 10:45:56
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445636
David Musil
verified
rating uzivatele
(68 hodnocení)
31. 3. 2020 10:52:15
Takže je lepší zvolit double? Aby byly hodnoty lépe reprezentovány?
31. 3. 2020 10:52:15
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445635
jenik1111
verified
rating uzivatele
(6 hodnocení)
31. 3. 2020 10:58:09
jo double je vic precizni, ale o neco drazsi datovy typ..zalezi od situace a pozadavku na preciznost
31. 3. 2020 10:58:09
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445634
Taky to může být kvůli PHP.
Jinak float a double je v PHP to samé;-)
31. 3. 2020 11:23:49
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445633
Milan Horník
verified
rating uzivatele
(8 hodnocení)
31. 3. 2020 11:27:09
nastavil sem si php 7.3 nemam s tim zkusenosti, takze treba problem bude tam:) nevim jake velke rozdily tam jsou, tj php 5.x vs 7.x (s tim ze 7.x ma byt rychejsi, pouziva novy engine)
31. 3. 2020 11:27:09
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445632
Marián
verified
rating uzivatele
(4 hodnocení)
31. 3. 2020 12:19:51
Nezrovnalosti resp. problemy so zaokruhlovanim mozu byt aj pri datovom type DOUBLE. Tam sa tiez mozete stretnut s hodnotou napr 0.90000000000000004 namiesto 0.90.
Ja preferujem pouzivat DECIMAL.
31. 3. 2020 12:19:51
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445631
TomasX
verified
rating uzivatele
(4 hodnocení)
31. 3. 2020 12:51:33
nevím o tom, že by se v tomhle verze mysql měnily, spíše se mění prezentace čísla, jak už je v diskuzi zmíněno. Stejně tak float a double jsou stejné a nepřesné. Na jakékoliv peněžní hodnoty je nutné používat decimal, který ukládá číslice jako číslice a nikoliv v binární reprezentaci. Decimal se ale při výpočtech převádí na double a chce ho řádně zaokrouhlit před uložením.
Nepřesnost ve výpočtech s float/decimal je a vždy bude, desetinné číslo se ukládá jako exponent dvou a není možné s ním vyjádřit všechna reálná čísla. Osobně v praxi buď převádím desetinná čísla na celá (vynásobením třeba 10000) a počítám s celými čísly a před zobrazením jen posunu desetinou čárku zpátky nebo používám technologie, které minimalizují chybovost tohoto typu.
31. 3. 2020 12:51:33
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445630
Jan Bezdíček
verified
rating uzivatele
(6 hodnocení)
31. 3. 2020 14:00:19
Float/Double neni presny, pouzivej DECIMAL(10,2)
31. 3. 2020 14:00:19
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445629
hm
verified
rating uzivatele
(20 hodnocení)
31. 3. 2020 14:11:07
mam jednu zasadu... Na presny pocitani/ukladani desetinejch mist (treba penez), zasadne DECIMAL a nikdy nic jinyho...
31. 3. 2020 14:11:07
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445628
kojot6
verified
rating uzivatele
31. 3. 2020 21:55:31
Napsal Milan Hornik;1576619
napriklad 9 x 7,40 mne vrati jako 66.600000858307 , namisto 66.60.
Číslo 66.600000858307 je plně reprezentované float a je správně. Celá věc je trošku složitější, pramení to z toho, že float je součet zlomků ve dvojkové soustavě (interně) a není možno uložit decimální desetinné číslo vždy v přesné decimální (desítkové) soustavě). Tj. jakmile uložíte číslo do float (případně klidně i double, to je fuk), tak dojde k převodu do dvojkové soustavy s jistou přesností. Přesně lze uložit pouze číslo, které se dá v dvojkové soustavě rozložit, tedy 1/2, 1/4, 1/8 apod. Tj. když uložíte 0.25, uloží se to přesně.
Některé aplikace zpravidla na výsledku nezobrazují celé číslo, ale jenom jeho zaokrouhlenou část, proto v phpmyadmin vidíte 66.60. Pak se dostáváte k dalším problémům, a to je jak zaokrouhlovat, je asi 8 způsobů, možná více, jak zaokrouhlit číslo, a každý má jiné použití, zejména ve financích je potřeba ovšem toto dělat správně, jinak vám ve velkém množství položek ty věci nebudou vycházet.
Pokud pracujete s účetními daty, vyhněte se float i double, protože u obou dochází k převodu do dvojkové soustavy a tedy nepřesnosti - můžete si to vyzkoušet sám - zkuste si v php if((0.1+0.2) == 0.3) - nerovná!
Použijte tedy datový typ Decimal - https://php-decimal.io/ . Pozor, když zadáváte číslo do typu do Decimal, předáváte ho většinou jako string, tedy ne Decimal(0.1), protože to by bylo Decimal(float(0.1)) a provedla by se nepřesná konverze, ale jako string Decimal("0.1"). A pak if ((Decimal("0.1") + Decimal("0.2")) == Decimal("0.3")) a to už pak narozdíl od float vrátí true, protože nedochází k převodu do dvojkové soustavy. Jediná nevýhoda je o něco nižší výkon, ale pro představu sečtení miliardy čísel místo 5 sekund bude trvat 15 vteřit, takže u nákupního košíku to nehraje roli.
Takovéhle detaily většina lidí, co neprogramuje profesionálně prostě nemůže vědět.
31. 3. 2020 21:55:31
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445627
Jo, floaty jsou mrchy https://web.ma.utexas.edu/users/arbogast/misc/disasters.html
31. 3. 2020 23:14:06
https://webtrh.cz/diskuse/mysql-php-wedos-presnost-vypoctu-float/#reply1445626
Pro odpověď se přihlašte.
Přihlásit