J'ai hérité d'une énorme pile de code hérité écrit en PHP au-dessus d'une base de données MySQL. Ce que j'ai remarqué, c'est que l'application utilise doubles
pour le stockage et la manipulation des données.
Maintenant, je suis tombé sur de nombreux messages mentionnant comment double
ne conviennent pas aux opérations monétaires en raison des erreurs d'arrondi. Cependant, je n'ai pas encore trouvé de solution complète sur la façon dont les valeurs monétaires doivent être traitées dans le code PHP et stockées dans une base de données MySQL.
Existe-t-il une meilleure pratique lorsqu'il s'agit de gérer de l'argent spécifiquement en PHP?
Les choses que je recherche sont:
- Comment les données doivent-elles être stockées dans la base de données? type de colonne? Taille?
- Comment les données doivent-elles être gérées en addition, soustraction normales? multiplication ou division?
- Quand dois-je arrondir les valeurs? Combien d'arrondi est acceptable le cas échéant?
- Existe-t-il une différence entre la gestion de valeurs monétaires élevées et de valeurs faibles?
Remarque: Un exemple de code TRÈS simplifié de la façon dont je pourrais rencontrer des valeurs monétaires dans la vie quotidienne (divers problèmes de sécurité ont été ignorés pour la simplification. Bien sûr, dans la vraie vie, je n'utiliserais jamais mon code comme celui-ci):
$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?
J'espère que vous utilisez cet exemple de code comme un moyen de faire ressortir plus de cas d'utilisation et de ne pas le prendre à la lettre bien sûr.
Question bonus Si je dois utiliser un ORM tel que Doctrine ou PROPEL, à quel point sera-t-il différent d'utiliser de l'argent dans mon code.
decimal
type en C # a une précision limitée mais convient parfaitement aux valeurs monétaires.