sql >> Database teknologi >  >> RDS >> Mysql

MySQL &PHP decimal præcision forkert

Fra en artikel, jeg skrev til Authorize.Net :

En plus en er lig med to, ikke? Hvad med 0,2 plus 1,4 gange 10? Det svarer til 16, ikke? Ikke hvis du regner med PHP (eller de fleste andre programmeringssprog):

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

Dette skyldes, hvordan flydende kommanumre håndteres internt. De er repræsenteret med et fast antal decimaler og kan resultere i tal, der ikke stemmer helt, som du forventer. Internt beregner vores .2 plus 1,4 gange 10 eksempel til omkring 15,9999999998 eller deromkring. Denne form for matematik er fint, når man arbejder med tal, der ikke behøver at være præcise som procenter. Men når man arbejder med penge, er præcision vigtige, for en krone eller en dollar, der mangler her eller der, stiger hurtigt, og ingen kan lide at være i den korte ende af manglende penge.

BC Math Solution

Heldigvis tilbyder PHP BC Math-udvidelsen som er "til vilkårlig præcisionsmatematik tilbyder PHP den binære lommeregner, som understøtter tal af enhver størrelse og præcision, repræsenteret som strenge." Med andre ord kan du lave præcis matematik med pengeværdier ved at bruge denne udvidelse. BC Math-udvidelsen indeholder funktion s, der giver dig mulighed for at udføre de mest almindelige operationer med præcision, herunder addition , subtraktion , multiplikation , og division .

Et bedre eksempel

Her er det samme eksempel som ovenfor, men ved at bruge funktionen bcadd() til at lave matematikken for os. Det kræver tre parametre. De to første er de værdier, vi ønsker at tilføje, og den tredje er antallet af decimaler, vi ønsker at være præcise med. Da vi arbejder med penge, indstiller vi præcisionen til at være to decimaler.

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


  1. tilfældige tal i java

  2. MySQL trigger 'opdatering på kolonne' syntaks

  3. Php simpelt login script hvid side

  4. 3 måder at udtrække måneden fra en dato i SQL Server (T-SQL)