Co používáte na ukládání a počítání ceny – float, string?
- filsedla
- Člen | 101
Ahoj, dělám úplně jednoduchý eshop. V košíku se vyskytují výpočty, příklad:
$totalPricePerProduct = $productPrice * $quantity;
V databázi máme ceny uložené jako decimal(10,2) unsigned
(protože to doporučují na stackoverflow). Nemůžu se ale rozhodnout,
s jakým typem mám pak s cenami pracovat v nette aplikaci.
Jsou 2 možnosti. Buď nechám kód, jako ten výše, $productPrice nette database vrátí jako float, výsledek je float. V šabloně to zaokrouhlím na 2 místa a všechno na 1. pohled funguje. Pokud si ale výsledek vypíšu na 20 míst, zjistím, že není přesný (tj. částka 39.30 je 39.29999999999999715783).
Druhou možností je použít BC math:
- Upravit Nette\Database\Helpers::$typePatterns (jde to, ale ne hezky), aby pro decimal vracel string.
- Použít funkce bcmul, bcadd apod. Vstupem i výsledkem je string.
$totalPricePerProduct = bcmul($productPrice, $quantity, 2);
BC math je doporučovaná cesta pro finanční výpočty, ale zase může chybět extension a musí se upravovat typePatterns. Co se vyplatí použít?
- Jan Endel
- Člen | 1016
Spíše než jednorozměrné datové typy doporučuju objekty – třebas tato knihovna – https://github.com/moneyphp/money (ze zkušenosti se prosím vyhni Kdyby/Money – má spoustu problému a moneyphp/money je implementována o něco lépe). Jednak se vyhneš float problémům a jednak se vyhneš třeba tomu, že sčítáš 10 Kč + 5 EUR :-).