MySQL et les valeurs monétaires

Pour stocker des valeurs monétaires dans une base de données, on a généralement le réflexe d’utiliser un champ de type FLOAT. Ce n’est cependant pas une bonne idée, en tout cas avec MySQL.

En effet, la documentation indique que MySQL arrondit les valeurs lors du stockage ce qui veux dire que la valeur récupérée n’est pas forcément exactement celle stockée ce qui est très gênant dans le cas de valeurs monétaires.

MySQL performs rounding when storing values, so if you insert 999.00009 into a FLOAT(7,4) column, the approximate result is 999.0001.

Il est préférable d’utiliser un champ de type DECIMAL comme préconisé dans la documentation de MySQL :

The DECIMAL and NUMERIC data types are used to store exact numeric data values. In MySQL, NUMERIC is implemented as DECIMAL. These types are used to store values for which it is important to preserve exact precision, for example with monetary data.

Ce contenu a été publié dans Développement Web. Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à MySQL et les valeurs monétaires

  1. Perrich dit :

    En fait, ce n’est pas lié à MySQL mais commun à l’ensemble des SGBD et des langages de programmations. Le pb, c’est la notation des nombres à virgules flotantes par l’ordinateur 🙁

    Il est vrai que l’on peut passer par des decimals cependant ce n’est pas géré de la même facon qu’un float (coût en place et en temps de traitement un poil plus important) et si l’on travaille sur des centimes et que l’on a une précision en 10-4 à priori on devrait pas avoir de soucis sur les additions (le pb arrive lorsque l’on fait des multiplications).

  2. L’autre solution, plus flexible, consiste à stocker ces valeurs comme des entiers et à utiliser des multiplicateurs en fonction du nombre de chiffres après la virgule (sachant que certains pays n’ont pas de centimes, d’autres vont jusqu’à 3 chiffres).
    Exemple:
    10025 x 0.01 = 100.25

Les commentaires sont fermés.