sql >> Base de Datos >  >> RDS >> Mysql

Precisión decimal de MySQL y PHP incorrecta

De un artículo que escribí para Authorize.Net :

Uno más uno es igual a dos, ¿verdad? ¿Qué tal .2 más 1.4 por 10? Eso es igual a 16, ¿verdad? No si estás haciendo los cálculos con PHP (o la mayoría de los otros lenguajes de programación):

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

Esto se debe a cómo se manejan internamente los números de punto flotante. Se representan con un número fijo de lugares decimales y pueden dar como resultado números que no suman como esperas. Internamente, nuestro ejemplo de .2 más 1.4 por 10 calcula aproximadamente 15.9999999998 más o menos. Este tipo de matemáticas está bien cuando se trabaja con números que no tienen que ser tan precisos como los porcentajes. Pero cuando se trabaja con dinero, la precisión es importante, ya que un centavo o un dólar que falta aquí o allá se suma rápidamente y a nadie le gusta estar en el extremo corto del dinero que falta.

La solución matemática de BC

Afortunadamente, PHP ofrece la extensión BC Math que es "para matemáticas de precisión arbitraria, PHP ofrece la calculadora binaria que admite números de cualquier tamaño y precisión, representados como cadenas". En otras palabras, puede hacer operaciones matemáticas precisas con valores monetarios utilizando esta extensión. La extensión BC Math contiene funciones s que le permiten realizar las operaciones más comunes con precisión, incluida la addition , resta , multiplicación y división .

Un mejor ejemplo

Aquí está el mismo ejemplo que el anterior pero usando la función bcadd() para hacer los cálculos por nosotros. Toma tres parámetros. Los dos primeros son los valores que deseamos sumar y el tercero es el número de decimales que deseamos precisar. Dado que estamos trabajando con dinero, estableceremos la precisión en dos lugares decimales.

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