MySQL decimal a Nette / PHP zaokrouhlovací chyby

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

Zdravím,

v DB (MySQL) ukládám přesná čísla (např. cenu) do typu DECIMAL (doc). Jak s takovým typem mám pracovat v PHP, resp. v Nette?

Koukal jsem, že PHP to asi nějak moc nativně neumí. A už vůbec si nejsem jist, co se děje v případě obalení přes Nette? Předpokládám, že mi to do PHP vyplivne nějaký float, který má ale jinou přesnost.

Popřípadě jaká je praxe (např. co se týče cen)?

jtousek
Člen | 951
+
0
-

Kdybys to chtěl řešit tak abys úplně eliminoval zaokrouhlovací chyby, musel by sis upravit Nette\Database\Helpers::$typePatterns, aby převáděl typ DECIMAL na něco jiného než float a poté v Nette\Database\Statement::normalizeRow s tímto novým typem dělat něco jiného – např. si vytvořit nějakou vlastní třídu Decimal, která by implementovala potřebné chování. Ještě kdyby tak PHP mělo přetěžování operátorů. :(

h4kuna
Backer | 740
+
0
-

DECIMAL je v db representovaný jako řetězec. PDO tahá všechno jako řetězec a Nette\Database se snaží detekovat typ a patřičně ho upravit.

  • pokud to potřebuješ obejít obal to CONCAT(column) a bude ti vrácen řetězec

nebo

  • udělej si výpočet v databázi a pokud tam je rozumný počet desetiných míst tak tě převod na float netrápí
llook
Člen | 407
+
0
-

PHP žádný zvláštní typ pro fixed-point nemá, pro valnou většinu PHP aplikací nemá smysl. Ale aspoň základní aritmetické operace lze realizovat BCMath funkcemi: http://php.net/…/book.bc.php