PHP aritmetika rubrika: Programování: PHP

1 dejmad
položil/-a 24.10.2017

Ahoj,

mám problém s aritmetikou v PHP. Asi jsem zrovna chyběl ve škole, když se probíraly kupecké počty :)

Může mi někdo prosím vysvětlit proč se děje co se děje?

        $cislo1 = 150.21;
        $cislo2 = $cislo1+0.51;
        $cislo3 = $cislo2-$cislo1;
 
        var_dump($cislo1);
        echo "<br>";
        var_dump($cislo2);
        echo "<br>";
        var_dump($cislo3);

return
float(150.21)
float(150.72)
float(0.50999999999999)

proč se vrací 0.50999999999999 a ne 0.51 ?

phpinfo();
PHP Version 5.5.19
Build Date   Nov 12 2014 12:29:42
Compiler    MSVC11 (Visual C++ 2012)
Architecture    x86 

A jak to eventuelně řešíte?

ironic
Mám to radši počítat v SQL serveru :)
SELECT (150.21+0.51)-150.21 = 0.51
/ironic

Děkuji za rozsvícení

odkaz Vyřešeno
Anonym
odpověděl/-a 24.10.2017
 
upravil/-a 24.10.2017

Tam nie je čo "osvecovať" :) To je proste problematika float - čísiel s plávajúcou desatinnou čiarkou. Je to absolútny základ programovania - vedieť, že počítač nevie pracovať s desatinnými číslami a výsledné výpočty majú obmedzenú presnosť. Z toho dôvodu je to proste problém absolútne každého programovacieho jazyka a zároveň dôvod, prečo sa float zrovna často nepoužíva a tam, kde je presnosť vyžadovaná, je doslova zakázané použiť ho.

Keď už tam vidím ten SELECT ... pokiaľ robíš databázovú aplikáciu s PHP a MariaDB / MySQL napríklad, a držíš si nejaké desatinné číslo v databáze, povedzme, že stav pokladne, beztak by si nemal stav pokladne updatovať tak, ako to často vidím: načítam si z databázy aktuálny stav pokladne a uložím v PHP do premennej, k tej premennej pripočítam napríklad vklad z inputu či inej premennej a s výslednou sumou urobím UPDATE v databáze. Odporúčaný postup je niečo na spôsob "UPDATE pokladna SET stav = stav + vklad WHERE ...". A ak si navyše nadefinuješ stĺpec stav ako "exact numeric data type", čiže DECIMAL (NUMERIC), tak Ti bude stav takejto pokladne, udržovaný takýmto postupom, vždy sedieť na cent.

Pro zobrazení všech 8 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.