sql >> Databasteknik >  >> RDS >> Mysql

MySQL &PHP decimalprecision fel

Från en artikel jag skrev för Authorize.Net :

Ett plus ett är lika med två, eller hur? Vad sägs om 0,2 plus 1,4 gånger 10? Det motsvarar 16, eller hur? Inte om du räknar med PHP (eller de flesta andra programmeringsspråk):

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

Detta beror på hur flyttalsnummer hanteras internt. De representeras med ett fast antal decimaler och kan resultera i tal som inte blir riktigt som du förväntar dig. Internt beräknar vårt .2 plus 1,4 gånger 10 exempel till ungefär 15,9999999998 eller så. Den här typen av matematik är bra när man arbetar med siffror som inte behöver vara exakta som procentsatser. Men när man arbetar med pengar spelar precision roll eftersom en slant eller en dollar som saknas här eller där räcker snabbt och ingen gillar att vara i korta delen av saknade pengar.

BC Math Solution

Lyckligtvis erbjuder PHP BC Math-tillägget som är "för godtycklig precisionsmatematik erbjuder PHP den binära kalkylatorn som stöder siffror av valfri storlek och precision, representerade som strängar." Med andra ord kan du göra exakt matematik med monetära värden med hjälp av denna förlängning. BC Math-tillägget innehåller funktion s som låter dig utföra de vanligaste operationerna med precision inklusive tillägg , subtraktion , multiplikation , och division .

Ett bättre exempel

Här är samma exempel som ovan men med funktionen bcadd() för att räkna ut åt oss. Det krävs tre parametrar. De två första är de värden vi vill lägga till och den tredje är antalet decimaler vi vill vara exakta med. Eftersom vi arbetar med pengar ställer vi in ​​precisionen till två decimaler.

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


  1. Stöder MySQL historiskt datum (som 1200)?

  2. Arbeta med datum i PostgreSQL

  3. Google Chart Tools med PHP och MySQl

  4. Hur man framgångsrikt skriver om gammal mysql-php-kod med föråldrade mysql_*-funktioner?