begin process at 2012 05 27 19:48:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :9 251

Auteur : skrol29

Ecrire un message privé
Site perso
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....
************************************

Voi ci 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

 Sources du même auteur

LISTER LES PAGES DE CODE SUPPORTÉES PAR WINDOWS
REPOSITIONNER ET/OU ÉTIRER AUTOMATIQUEMENT LES CONTRÔLES
SIMPLIFIER LES REQUÊTES SQL SOUS ADO / ADODB
TRADUCTION D'UN MONTANT NUMÉRIQUE EN EXPRESSION LITTÉRALE
Source avec Zip Source avec une capture SUPERMOUSE : DEVENEZ MANIPULATEUR

 Sources de la même categorie

ENUM TYPE POUR JAVASCCRIPT par triumphs
Source avec Zip DLL PERSONNALISÉ AVEC ÉVÈNEMENTS ET PROPRIÉTÉS EN VB6. par Number7
Source avec Zip Source .NET (Dotnet) EXEMPLE DU TUTORAIL "CLASSES MÉTIER" par Adn56
Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION DES LISTES : RANGEMENT (LIST.SORT) ET FILTRAGE (LIST... par kbalist
Source avec Zip EXEMPLE SUR LES MENUS POUR AIDER LES DÉBUTANTS COMME MOI ;-) par viragoloco

 Sources en rapport avec celle ci

Source avec Zip TEXTBOX EN NUMÉRIQUE par 320C
Source avec Zip Source .NET (Dotnet) CONVERSION DE DEVISE MONAITAIRE VIA UN SERVICE WEB par bigmonkey7
Source .NET (Dotnet) LECTURE DE FICHIER *.OFX par Norres
Source avec Zip CONVERTIR DÉC-BIN-OCT-HEX par titpeanut
Source avec Zip CONVERTISSEUR DEVISES ACTUALISÉ par Avidang

Commentaires et avis

Commentaire de PtitJeoJeo le 16/07/2002 16:52:38

je retien !
Ptitjeojeo

Commentaire de OphidiaN le 16/07/2002 18:35:12

kler, j'avais jamais vu....

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

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.

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

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

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

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

Commentaire de FENETRES le 04/01/2008 11:50:32 8/10

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

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

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales