Co používáte na ukládání a počítání ceny – float, string?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
filsedla
Člen | 101
+
0
-

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:

  1. Upravit Nette\Database\Helpers::$typePatterns (jde to, ale ne hezky), aby pro decimal vracel string.
  2. 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?

David Grudl
Nette Core | 8228
+
+2
-

Pro úplně jednoduchý eshop použij float. Pro bankovní systém BC math.

Jan Endel
Člen | 1016
+
+3
-

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

filsedla
Člen | 101
+
0
-

díky za tipy

David Matějka
Moderator | 6445
+
+4
-

Dalsi moznosti je pracovat s int-em v centech/halirich