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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 011 fois - Téléchargée 45 fois

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

Ajouter un commentaire Commentaires
jeuxsimple Messages postés 6 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 20 avril 2008
20 avril 2008 à 02:25
merci beaucoup skrol29 c bien marcher .merci de ton aide a+
FENETRES Messages postés 196 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 14 avril 2009
4 janv. 2008 à 11:50
Très pertinent, le conseil est toujours d'actualité !
nourwahiba Messages postés 82 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 23 juin 2011
2 août 2006 à 11:10
bonjour skrol29
merci pour votre reponse et je vais l'essayer immediatement sur mon pc j'esoere que ca va y aller
merci
bonne suite ....
skrol29 Messages postés 114 Date d'inscription vendredi 3 mai 2002 Statut Membre Dernière intervention 17 novembre 2014
30 juil. 2006 à 22:45
Nourwahiba : En VB ou SQL-Serveur le type monétaire se gère de la même manière que toutes les autres valeurs de type numérique. Simplement tu dois faire attention à quelque chose qui est général pour les valeurs numériques : si ton Visual Basic est en français, la conversion passive de numérique en chaîne se fait avec une virgule comme séparateur de décimale. Or celle-ci n'est pas accpetée par SQL-Serveur qui attend un point. Il faut donc faire une conversion explicite de tes montants en utilisant la fonction Format() de Visual Basic.
Exemple :
$SQL = "INSERT INTO ma_table (montant) VALUES (". & Format(montant,"0.0000") & ")"
nourwahiba Messages postés 82 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 23 juin 2011
29 juil. 2006 à 16:15
bonjour
je veux savoir comment faire pour inserer une variable cuurency ( vb) dans une table sql serveur ( champ en money) car quand j'ai essayé d'inserer ma facture( n° facture , ttc) dans ma table sa me pose un probleme
alors quoi faire exactement
Afficher les 10 commentaires

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.