Heredé una gran cantidad de código heredado escrito en PHP sobre una base de datos MySQL. Lo que noté es que la aplicación utiliza doubles
para el almacenamiento y la manipulación de datos.
Ahora me encontré con numerosas publicaciones que mencionan cómo double
no son adecuadas para las operaciones monetarias debido a los errores de redondeo. Sin embargo, todavía tengo que encontrar una solución completa sobre cómo se deben manejar los valores monetarios en el código PHP y almacenarlos en una base de datos MySQL.
¿Existe una mejor práctica cuando se trata de manejar dinero específicamente en PHP?
Las cosas que estoy buscando son:
- ¿Cómo deben almacenarse los datos en la base de datos? tipo de columna? ¿Talla?
- ¿Cómo deben manejarse los datos en suma, resta normales? multiplicación o división?
- ¿Cuándo debo redondear los valores? ¿Cuánto redondeo es aceptable si hay alguno?
- ¿Hay alguna diferencia entre manejar valores monetarios grandes y valores bajos?
Nota: Un código de muestra MUY simplificado de cómo podría encontrar valores monetarios en la vida cotidiana (varias preocupaciones de seguridad fueron ignoradas para simplificar. Por supuesto, en la vida real nunca usaría mi código así):
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
Espero que use este código de muestra como un medio para sacar más casos de uso y no tomarlo literalmente, por supuesto.
Pregunta adicional Si voy a usar un ORM como Doctrine o PROPEL, ¿qué tan diferente será usar dinero en mi código?
decimal
tipo en C # tiene una precisión limitada pero se adapta perfectamente a los valores monetarios.