sql >> Databáze >  >> RDS >> Mysql

Nesprávná přesnost desetinných míst MySQL a PHP

Z článek, který jsem napsal pro Authorize.Net :

Jedna plus jedna se rovná dvěma, že? Co třeba 0,2 plus 1,4 krát 10? To se rovná 16, že? Ne, pokud počítáte s PHP (nebo s většinou ostatních programovacích jazyků):

echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!

To je způsobeno tím, jak jsou interně zpracována čísla s pohyblivou řádovou čárkou. Jsou reprezentovány pevným počtem desetinných míst a výsledkem mohou být čísla, která se nesčítají tak, jak byste očekávali. Interně náš příklad 0,2 plus 1,4 krát 10 vypočítá zhruba 15,9999999998 nebo tak. Tento druh matematiky je vhodný při práci s čísly, která nemusí být přesná jako procenta. Ale při práci s penězi na přesnosti záleží, protože tu či tam chybějící cent nebo dolar se rychle sčítají a nikomu se nelíbí, že je na krátkém konci chybějících peněz.

The BC Math Solution

Naštěstí PHP nabízí rozšíření BC Math což je "pro libovolně přesnou matematiku PHP nabízí binární kalkulačku, která podporuje čísla libovolné velikosti a přesnosti, reprezentovaná jako řetězce." Jinými slovy, pomocí tohoto rozšíření můžete přesně počítat s peněžními hodnotami. rozšíření BC Math obsahuje funkci s, které vám umožňují provádět nejběžnější operace s přesností, včetně přídavku , odčítání , násobení a divize .

Lepší příklad

Zde je stejný příklad jako výše, ale pomocí funkce bcadd() to uděláme za nás. Chce to tři parametry. První dvě jsou hodnoty, které chceme sečíst, a třetí je počet desetinných míst, na která chceme být přesní. Protože pracujeme s penězi, nastavíme přesnost na dvě desetinná místa.

echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.


  1. SQL Server 2016:Obnovení databáze

  2. Jak získat náhodné řádky z tabulky SQL Server - SQL Server / Výukový program TSQL část 117

  3. Přidání hodin, minut, sekund k datu SQL

  4. EF Core - Tabulka '*.__EFMigrationsHistory' neexistuje