Autor Zpráva
Jan Doležal
Profil
Používám poslední verzi php 5.5.7 na windows 7.
precision v php.ini nastaven na 14 (výchozí hodnota), serialize_precision na 17 (výchozí hodnota)

Mám soubor qif (záznam financí), jendá se o jednoduhý testový soubor, který si načtu a pak po řádku prasuji.
Každý řádek mám jako prefix nějaké písmeno a podle toho se značí oč jde.

Mám tento jednoduchý kod.
$val  = trim(substr($line, 1)); // $line je vyparsovaný string roven "T851.24"

echo $val; // "851.24"
echo (float) $val; // "851.24000000000001"
echo round($val, 2); // "851.24000000000001"

Problém je v tom, že někdy to přidá "000000000001", ale jindy to poslední číslo zmenší o 1 a přihodí "999999999999".

Jak se toho zbavit a poč se toto mrvení čísel vůbec děje?
juriad
Profil
PHP prostě počítá nepřesně; není to možné z toho důvodu, že mezi 851.23 a 851.25 existuje nekonečně mnoho čísel a formát float umí reprezentovat jen některé z nich a 851.24 mezi nimi třeba není.
Řešením je vhodně zaokrouhlit.
Časté potíže, zajímavosti a poučné debaty » Výsledkem výpočtu 1 - 0.9 není přesně 0.1
Jan Doležal
Profil
juriad:
Co je to vhodně zokrouhlovat?
Jelikož se jedná o finance, tak rozhodně nemohu zaokrouhlit na na celá čísla, což by php snad už zvládlo.
Nicméně nechápu, proč to ta čísla mrví, když to s nimi napočitá.
Davex
Profil
Jan Doležal:
Nicméně nechápu, proč to ta čísla mrví, když to s nimi napočitá.
Vysvětlení: Podmínka (násobení)
pcmanik
Profil
Jan Doležal:
Pre presné počítanie môžes využiť BC Math.
Jan Doležal
Profil
Ok. Díky.
Alespon už vím proč se to děje a řešení snad někde najdu.
Zajímavostí je, že na stejném pc při verzi php 5.5.4 se toto nedělo.

Akorát všechny vysvětlení jsou o počítání, já nic nepočátám. Jen vyparsuji string a chci ho převést na float.
Jan Tvrdík
Profil
Jan Doležal:
Jelikož se jedná o finance, tak rozhodně nemohu zaokrouhlit na na celá čísla
Právě u financí se běžně počítá s celými čísly, akorát musíš částky ukládat v haléřích.
Jan Doležal
Profil
Jan Tvrdík:
Bohužel tohle moc řešit nemohu. Aplikace mi to ukládá takto. Ikdyž je mi jsané, že tvé řešení by vše vyřešilo ;)
petr 6
Profil
Jan Doležal:
Az se ti kvuli zaokrouhlovani ztrati radove sto tisic korun, tak to treba resit budes muset. (Zkusenost z predchozi firmy. Kolega, ktery za to byl zodpovedny, dostal na miste vypoved.)

Takze bych tez doporucoval u financi pocitat s integer, tedy haleri/centy, tedy radeji upravit tu aplikaci

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: