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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 482 fois - Téléchargée 43 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

Messages postés
6
Date d'inscription
mercredi 5 mars 2008
Statut
Membre
Dernière intervention
20 avril 2008

merci beaucoup skrol29 c bien marcher .merci de ton aide a+
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009

Très pertinent, le conseil est toujours d'actualité !
Messages postés
82
Date d'inscription
mardi 18 octobre 2005
Statut
Membre
Dernière intervention
23 juin 2011

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 ....
Messages postés
115
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
17 novembre 2014

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") & ")"
Messages postés
82
Date d'inscription
mardi 18 octobre 2005
Statut
Membre
Dernière intervention
23 juin 2011

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.