Dur Comme Faire

Aller au contenu | Aller au menu | Aller à la recherche

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.

vendredi 16 février 2007 à 14h23 - Développement Web Fil de syndication

Rétroliens

Aucun rétrolien pour le moment.

Les rétroliens pour ce billet sont fermés.

Commentaires

Gravatar de Perrich

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).

Perrich le mardi 20 février 2007 à 21h03 Icone du permalien

Gravatar de Bertrand Mansion

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

Bertrand Mansion le lundi 26 février 2007 à 09h08 Icone du permalien

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.

XHTML - CSS - DotClear - Technorati

Les billets de ce blog sont sous licence Creative Commons