| 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 |
#2 · Zasláno: 2. 1. 2014, 22:22:18
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 |
#3 · Zasláno: 2. 1. 2014, 22:27:08
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 |
#4 · Zasláno: 2. 1. 2014, 23:08:47
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 |
#5 · Zasláno: 2. 1. 2014, 23:34:18
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 |
#7 · Zasláno: 2. 1. 2014, 23:39:29
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 |
#8 · Zasláno: 2. 1. 2014, 23:40:57
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 |
#9 · Zasláno: 2. 1. 2014, 23:49:53
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 |
||
|
Časová prodleva: 12 let
|
|||
0