php mysql decimal currency floating-accuracy

PHP/MySQL: ¿Mejores operaciones de dinero/prácticas de almacenamiento?



decimal currency (2)

Definitivamente, me gustaría utilizar entradas y enrutar todo a través de un estilo de objeto de datos (ORM) que luego se encarga de todas las conversiones por usted. El código del cliente que usa el objeto de datos nunca tendrá que hacer conversión y no le importará, mientras que no tendrá problemas con el almacenamiento, ya que la base de datos se maneja fácilmente. Además, puede agregar cualquier otro método necesario para el objeto de dinero (como las conversiones entre tipos de dinero, etc.) con bastante facilidad.

Por lo tanto, estoy planeando hacer una aplicación (PHP / MySQL) que se ocupe mucho del dinero, y estoy pensando en cómo almacenar y operar con el dinero, refiriéndome al tipo de datos flotante de PHP y MySQL decimal.

Estaba pensando en dos opciones. Uno de ellos es operar y almacenar dinero en formato de centavos enteros ($ dólares * 100) para no tratar con imprecisiones de flotación y almacenarlo en la base de datos como un entero. El otro es almacenar en DB como decimal y usar BC Math en PHP para cálculos.

Así que busqué en Google toda la noche para descubrir cuál es la mejor opción para usar y no encontré una respuesta clara. La única opción razonable que he visto fue el número entero de centavos (lo que realmente no me gusta porque implicaría una gran cantidad de conversión de dólares a centavos y viceversa antes de cada visualización en el navegador y antes de almacenar en la base de datos).

Además, la gente se ha quejado de MySQL decimal (MySQL almacena decimales como cadenas, los opera como flotadores, etc.), pero eso era publicaciones antiguas. De acuerdo con la documentación de MySQL, la versión actual maneja los decimales correctamente, la única queja fue que trunca la fracción de los valores que excede la longitud de la fracción declarada (por ejemplo, si almacena un valor de 12.326 en una columna declarada decimal (9.2)) , pero de mis investigaciones lo redondea en lugar de simplemente truncarlo (12.326 se convierte en 12.33), lo cual, en mi opinión, es correcto.

Y no encontré ninguna recomendación sobre almacenar dinero como decimales y hacer cálculos utilizando PHP BCMath, y en mi opinión esto se debe a que pocas personas conocen las funciones matemáticas de BC y GMP.

Entonces, ¿cuál sería la mejor opción de uso, teniendo en cuenta la precisión, la velocidad (velocidad de los cálculos de BCMath, la velocidad decimal de MySQL y el número entero) y la comodidad de la programación?