MySQL decimal a Nette / PHP zaokrouhlovací chyby
- kedrigern
- Člen | 102
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
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
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
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