Založení a design webu a eshopu taneční školy
Zobrazují se odpovědi 1 až 14 z 14

Mysql, php, wedos, presnost vypoctu float

  1. 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?

  2. Co se právě děje na Webtrhu?
  3. Citace Původně odeslal Milan Hornik Zobrazit příspěvek
    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.

  4. Proč se tak děje ?
    Protože WEDOS !!!

    Používej v php konverzi např.
    Kód:
    $number = number_format((float)$number, 2, ',', '');

  5. tak jsem to presne udelal :)

  6. 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/uploa...Capture-27.png

    Detaily a duvody urcite najdete v oficialni dokumentaci mysql.

  7. Takže je lepší zvolit double? Aby byly hodnoty lépe reprezentovány?

  8. jo double je vic precizni, ale o neco drazsi datovy typ..zalezi od situace a pozadavku na preciznost

  9. Taky to může být kvůli PHP.

    Jinak float a double je v PHP to samé;-)

  10. 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)

  11. 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.

  12. 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.

  13. Float/Double neni presny, pouzivej DECIMAL(10,2)

  14. Citace Původně odeslal Milan Hornik Zobrazit příspěvek
    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.


Spolupracujeme: Jooble.org, Aximum - profesionální překlady Hostujeme u Server powered by TELE3