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

Precisione decimale MySQL e PHP errata

Da un articolo che ho scritto per Authorize.Net :

Uno più uno fa due, giusto? Che ne dici di 0,2 più 1,4 per 10? Ciò equivale a 16, giusto? Non se stai facendo i conti con PHP (o la maggior parte degli altri linguaggi di programmazione):

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

Ciò è dovuto al modo in cui i numeri in virgola mobile vengono gestiti internamente. Sono rappresentati con un numero fisso di cifre decimali e possono risultare in numeri che non si sommano proprio come ci si aspetta. Internamente il nostro esempio .2 più 1,4 volte 10 calcola circa 15,9999999998 o giù di lì. Questo tipo di matematica va bene quando si lavora con numeri che non devono essere precisi come le percentuali. Ma quando si lavora con i soldi, la precisione conta come un centesimo o un dollaro che manca qua o là si somma rapidamente e a nessuno piace essere a corto di soldi mancanti.

La soluzione matematica BC

Fortunatamente PHP offre l'estensione BC Math che è "per la matematica di precisione arbitraria PHP offre la calcolatrice binaria che supporta numeri di qualsiasi dimensione e precisione, rappresentati come stringhe". In altre parole, puoi fare calcoli precisi con valori monetari usando questa estensione. L'estensione BC Math contiene la funzione s che consentono di eseguire le operazioni più comuni con precisione, inclusa l'aggiunta , sottrazione , moltiplicazione e division .

Un esempio migliore

Ecco lo stesso esempio di cui sopra ma usando la funzione bcadd() per fare i calcoli per noi. Occorrono tre parametri. I primi due sono i valori che desideriamo aggiungere e il terzo è il numero di cifre decimali su cui vogliamo essere precisi. Dal momento che stiamo lavorando con il denaro, imposteremo la precisione su due cifre decimali.

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