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.