Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CURRENCY : UN TYPE MÉCONNU (MONEY SOUS SQL-SERVER)


Information sur la source

Catégorie :Tutoriaux Classé sous : currency, money, devise, décimale, numérique Niveau : Initié Date de création : 16/07/2002 Date de mise à jour : 04/01/2008 14:23:31 Vu : 6 733

Note :
7 / 10 - par 2 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

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

Historique

04 janvier 2008 14:23:31 :
petites précisions ajoutées

Commentaires et avis

signaler à un administrateur
Commentaire de PtitJeoJeo le 16/07/2002 16:52:38

je retien !
Ptitjeojeo

signaler à un administrateur
Commentaire de OphidiaN le 16/07/2002 18:35:12

kler, j'avais jamais vu....

signaler à un administrateur
Commentaire de Sirocooo le 17/07/2002 11:50:35

Par expérience je peux dire aujourdh'ui que stocker ses données avec virgule flotante ou fixe source de bugs et d'erreurs.
Quand on développe une grosse appli, un jour ou l'autre ca pete à la figure !!!

Je conseil de travailer en entier long (donc en centimes) c'est beaucoup plus fiable et précis.
à bon entendeur,...

signaler à un administrateur
Commentaire de skrol29 le 17/07/2002 13:28:43

>Je conseil de travailer en entier long (donc en centimes)

C'est justement comme cela que fonctionne le type Currency.
Il stock le montant  sans la virgule, et le gère comme un entier pour les opérations linéaires (somme, multiplication). Mais il restitue la représentation interne divisées 1000 (4 décimales) pour l'affichage et les autres calculs.
Trop fort le Currency.

signaler à un administrateur
Commentaire de gogomanu le 18/06/2003 13:21:57

Excellent currency, en regardant dans les docs j'avais pas bien compris à quoi ça servait j'avais l'impression que c'était une sorte de "double" en fait.
Très bon à savoir, je me suis flingué la tête à faire une procédure d'arrondi, ça parait tout con mais j'ai dû la retoucher plusieurs fois!

Public Function Arrondi(Calc As Variant, Optional ByVal ArrondiNombres% = 2, Optional ByVal JusteTronquer As Boolean = False) As Double
    ' Arrondi à N chiffres après la virgule (0,003 -> 0,00      0,005 -> 0,01)
    '   Calc:           Nombre à arrondir
    '   ArrondiNombres: Nombre de chiffres après la virgule
    '   JusteTronquer:  Arrondir en dessous
    '
    ' Optimisation avec un select case pour essayer d'améliorer ce qui est
    ' facilement améliorable: arrondi 2 est très fréquent par exemple.
    '
    Dim Decal As Double, Decal2 As Double, Tmp As Double
    
    On Error GoTo Err
    Select Case ArrondiNombres
        Case 2:
                Decal = 100
                Decal2 = 0.005
        Case 0:
                Decal = 1
                Decal2 = 0.5
        Case 1:
                Decal = 10
                Decal2 = 0.05
        Case 3:
                Decal = 1000
                Decal2 = 0.0005
        Case Else:
            Decal = 10 ^ ArrondiNombres
            Decal2 = (1 / (Decal + Decal))
    End Select
    If JusteTronquer Then Decal2 = 0
    
    Tmp = Nz(Calc, 0)
    If Decal2 <> 0 Then Tmp = Tmp + Decal2 ' pour ne pas déformer le "Double"
    If Decal <> 1 Then Tmp = Tmp * Decal
    '*** Je veux garder la partie ENTIERE EXACTE (merci access de daube)
    Tmp = Int(Tmp)
    If Decal <> 1 Then Tmp = Tmp / Decal
    Arrondi = Tmp
'*** La première version paraissait simple: mais bug dans certains cas !!! :
'    Arrondi = Int((Nz(Calc, 0) + Decal2) * Decal) / Decal
'********** fin de la première version
Fin:
    Exit Function

Err:
    MsgBox "Erreur Arrondi: " & vbCr & Err.Number & ": " & Err.Description, vbExclamation
    Resume Fin

End Function

signaler à un administrateur
Commentaire de nourwahiba le 29/07/2006 16:15:46

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

signaler à un administrateur
Commentaire de skrol29 le 30/07/2006 22:45:22

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") & ")"

signaler à un administrateur
Commentaire de nourwahiba le 02/08/2006 11:10:59

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

signaler à un administrateur
Commentaire de FENETRES le 04/01/2008 11:50:32 8/10

Très pertinent, le conseil est toujours d'actualité !

signaler à un administrateur
Commentaire de jeuxsimple le 20/04/2008 02:25:56

merci beaucoup skrol29 c bien marcher .merci de ton aide a+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

fonction Sub [ par coucou ] J'ai un travail dans lequel je dois calculer le taux de change (je rentre le montant et une devise et je la veux dans une autre devise.Et mon résultat Vb6 et Microsoft Money 2000 [ par Raf ] Comment peut on lire et exploiter des données saisies dans Money 2000 avec Vb6.Le fichier est *.mny. Numérique ou pas ? [ par Lolo ] Bonjour je voudrais savoir comment faire pour savoir si les données qui sont dans une variable sont de type numerique ou de type texte ?Il le semble q Savoir si QueryString("MaValeur") est numérique [ par jimini ] Bonjour,Est-ce qu'il y a un genre de IsNumeric() ?Merci de votre aide! Une virgule pour le pavé numérique [ par Fabrice ] Salut,Sur le pavé numérique ( en l' occurence externe ), quelle est la fonction qui permet de transformer le point en virgule ? Merci d' avance. Numérique / Alphanumériques ??? [ par duke nukem ] SalutJ'ai un Userform sur lequel je récupère une valeur dans un Textbox que je recopie dans une cellule .Je récupère par exemple en A1 la valeur 10 , Barre d'Etat et format numérique [ par massat ] Bonjour,voila j'ai 2 prb1) je viens de créer une application VB pour des utilisateur qui est en fait une gestion com. Je souhaiteari que quand on se p convertir une lettre en sa valeur décimale [ par Gabalgabow ] En VB,comment convertir une lettre en sa valeur décimale ou héxadécimale correpondante?Ex: a -->1 b -->2 c -->3GRIND YER FACE!! convertir une lettre en sa valeur décimale [ par Gabalgabow ] Comment compter le nombre d'enregistrement dans une base de données à partir de VB?GRIND YER FACE!! convertir une lettre en sa valeur décimale [ par Gabalgabow ] Comment compter le nombre d'enregistrement dans une base de données à partir de VB?GRIND YER FACE!!


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,889 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.