sql >> Database >  >> RDS >> Mysql

MySQL &PHP decimale precisie verkeerd

Van een artikel dat ik schreef voor Authorize.Net :

Eén plus één is twee, toch? Wat dacht je van 0,2 plus 1,4 keer 10? Dat is gelijk aan 16, toch? Niet als je rekent met PHP (of de meeste andere programmeertalen):

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

Dit komt door de manier waarop getallen met drijvende komma intern worden verwerkt. Ze worden weergegeven met een vast aantal decimalen en kunnen resulteren in getallen die niet helemaal kloppen zoals u verwacht. Intern rekent ons .2 plus 1.4 keer 10 voorbeeld tot ongeveer 15.9999999998 of zo. Dit soort wiskunde is prima bij het werken met getallen die niet precies hoeven te zijn, zoals percentages. Maar als je met geld werkt, is precisie belangrijk, want een cent of een dollar die hier of daar ontbreekt loopt snel op en niemand houdt ervan om aan het korte eind te zitten van ontbrekend geld.

De BC Math-oplossing

Gelukkig biedt PHP de BC Math-extensie dat is "voor willekeurige precisie wiskunde PHP biedt de binaire rekenmachine die getallen van elke grootte en precisie ondersteunt, weergegeven als strings." Met andere woorden, u kunt met deze extensie nauwkeurig rekenen met geldwaarden. De BC Math-extensie bevat functie s waarmee u de meest voorkomende bewerkingen met precisie kunt uitvoeren, inclusief toevoeging , aftrekken , vermenigvuldiging , en divisie .

Een beter voorbeeld

Hier is hetzelfde voorbeeld als hierboven, maar met de functie bcadd() om de wiskunde voor ons te doen. Er zijn drie parameters nodig. De eerste twee zijn de waarden die we willen toevoegen en de derde is het aantal decimalen waarop we nauwkeurig willen zijn. Omdat we met geld werken, stellen we de precisie in op twee decimalen.

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


  1. Aanroepnotatie voor PL/SQL-subroutines in Oracle Database

  2. Genereer unieke willekeurige alfanumerieke tekens die 7 tekens lang zijn

  3. Waar is mijn ongeldige teken (ORA-00911)

  4. Gegevens ophalen van mysql naar StreamBuilder Flutter