Currency : un type méconnu (money sous sql-server)

Contenu du snippet


La plupart des programmeurs utilisent le type Double pour manipuler des données monétaires. Pourtant il y a un type spécialement adapté pour gérer les montants : il s'agit du type Currency (Money Sous SQL-Server).
Vous pensez pouvoir vous contenter du type Double, vous avez probablement tors....


Voici un test qui va vous faire comprendre en deux secondes le problème des montants.
Sous Visual Basic, ouvrez la fenêtre de déboguage et tapez :
? 100.99 - 50.45 - 50.54
VB vous répond :
-7,105427357601E-15

Que s'est-il passé ?
Non, votre processeur n'a pas fait d'erreur de calcul. VB ne s'ait pas trompé.
Un code équivalent en C++ donnerait le même comportement.
En fait, sans vous le dire, VB a utilisé le type Single ou Double pour vos montants.
Ces deux type sont des représentation 'à virgule' flottante d'un nombre réel.
C'est donc une approximation du nombre qui est enregistré.

Comme le montre le résultat du test, l'approximation est très bonne (à 15 décimales près),
mais engendre une erreur dès qu'on veut comparer ce montant à un autre.

Par exemple, faites le test :
? (100.99 - 50.45 - 50.54) = 0
retourne
Faux

Et là, y'a problème.
Sans le savoir, votre application intègre peut être cette erreur !!

Heureusement, les concepteurs de langage sont conscients de ce problème.
Ils vous ont donc préparé un type spécial : le type Currency.
Ce type n'est pas une représentation 'à virgule flottante' mais une représentation 'à virgule fixe' avec 4 décimales après la virgule.
Il est spécialement adapté aux données monétaires car toutes les monnaies du monde ne gèrent pas plus de 2 décimales dans les montants. Donc avec une précision de 4, on est largement bon. En plus, comme sa représentation est fixe, les calculs de grandes sommes est particulièrement rapide.

Dans vos bases de données :
Il existe souvent un type numérique fixe pour les champs dans les bases de données.
Mais il y a toujours aussi un type spécial pour les montants (Money sous SQL-Server). Il est plus adapté.

Voilà, en conclusion je vous conseille d'utiliser systématiquement Currency (VB) ou Money (SQL-Server) pour travailler sur des montants.

Source / Exemple :


.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.