IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Encore un souci d'arrondi ou de convertion. [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Encore un souci d'arrondi ou de convertion.
    Bonne année à tous

    Je croyais avoir réglé mon souci d'arrondi, mais visiblement non ou alors c'est dans la conversion que je me trompe.

    Soit le code suivant, que vous pouvez copier coller dans une Sub toute bête et faire un call dessus, tout y est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Dim dblMtBrutBase, dblMtTaxeBase, dblMtnetBase, dblMtchargeBase, dblResultTaxe As Double
        dblMtBrutBase = 10198.75
        dblMtTaxeBase = 30
        dblMtchargeBase = 0
        dblMtnetBase = 7139.12
     
        If Round((dblMtBrutBase - ((dblMtBrutBase * dblMtTaxeBase) / 100)) - 0.000001, 2) <> dblMtnetBase And dblMtchargeBase = 0 Then
            'MtTaxeBase.BackColor = lngRed
            Debug.Print "Taxe en Rouge"
        Else
            dblResultTaxe = Round((((dblMtBrutBase * dblMtTaxeBase) / 100) - 0.000001), 2)
        End If
        If dblMtBrutBase - dblResultTaxe - dblMtchargeBase <> dblMtnetBase Then
            'MtChargeBase.BackColor = lngRed
            Debug.Print "Charge en Rouge"
        End If
    L'exécution donnera dans la fenêtre Immediate "Charge en rouge" alors que c'est pas vrai, le calcul doit tomber juste.
    Il y a truc avec dblResultTaxe qui me sort un 3059.625 de derrière les fagots et je comprend pas pourquoi. J'ai fait un arrondi, c'est pas pour du beurre, alors j'aimerais bien comprendre pourquoi le monsieur me traine le malheureux 5 à la fin qui me met la grouille dans mon test.

    Bref, voilà, je comprends pas comment corriger cela.
    Mais je suis sûr que ça doit être tout bête, comme toujours.....

    Merci pour votre aide.

    Plein de bonnes chose pour cette année 2018, pour vous tous et vos proches.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    D'abord les variables dblMtBrutBase, dblMtTaxeBase, dblMtnetBase, dblMtchargeBase ne sont pas en doubles, mais en variant.

    Commence déjà par remettre correctement toutes tes variables en double.

    Philippe

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    Dans le code d'origine j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        dblMtBrutBase = CDbl(Replace(MtBrutBase.Value, ",", "."))
        dblMtTaxeBase = CDbl(Replace(MtTaxeBase.Value, ",", "."))
        dblMtchargeBase = CDbl(Replace(MtChargeBase.Value, ",", "."))
        dblMtnetBase = CDbl(Replace(MtNetBase.Value, ",", "."))
    Parce que les données de base viennent d'une extraction d'un fichier texte et sont gérées en String.
    Du coup, je pense que c'est en Double avec le CDbl.

    J'ai mis des valeurs précises parce que c'est le cas précis qui me pose un souci.

    Après, je teste tout de meme avec cette modification de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dblMtBrutBase = CDbl(10198.75)
        dblMtTaxeBase = CDbl(30)
        dblMtchargeBase = CDbl(0)
        dblMtnetBase = CDbl(7139.12)
    Mais j'ai toujours "Charge en rouge" dans la fenêtre d'éxecution.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    Bonsoir

    Avec ma version (2007) le code de ton post fonctionne...

    Deux remarques (en plus de celle de Philippe sur les déclarations)
    - la somme des arrondis est rarement égale à l'arrondi de la somme
    - access pratique l'arrondi de banque : round(1.625,2)=round(1.615,2)=1.62

    Dans ton exemple on a donc logiquement 3059.62 + 7139.12 <> 10198.75
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut

    la somme des arrondis est rarement égale à l'arrondi de la somme
    Un cauchemar en comptabilité !
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide Nico84.

    Je vais tenter de me débrouiller avec ça.

    Je suis justement dans une banque, du coup, si c'est l'arrondi banque marche, ça devrait aller. Mais j'ai tout de même une incoherence entre mes deux sources.

    Je vais continuer de chercher.

    Merci et plein de bonnes choses à vous tous.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Les nombres réel dans les systèmes informatiques ne sont pas codés comme un humain s'y attendrai.
    Ils sont "approximés" au mieux des capacités de représentation du système.
    Donc il est possible que si tu mets 2, le système code en réalité : 1.9999999999 ce qui mathématiquement est considéré comme égale à 2 mais qu'un humain a du mal à accepter. (l'exemple avec 2 est n'est pas réel, 2 se code bien mais c'est pour illustrer le propos.)

    Une solution serait peut-être d'utiliser des champs de type "Monnais" (Currency) qui en principe code ce que tu vois donc 2 reste 2 mais j'ai lu quelque par que les champs currency étaient buggés et qu'il valait mieux ne pas s'en servir.

    Personnellement pour les arrondis j'utilise quelque chose comme : Val(format(TonNom,"0.00")) qui ne m'a jamais fait défaut.

    La solution ultime consite à stocker les nombre dans des chaînes et à reprogrammer soi-même les oppérations mathématiques sur ces chaînes en manipilant chaque cghiffre un à un.

    Une autre possibilité est de stocker tes réels comme des entiers et d'afficher une virgule à l'écran.
    Ex : 1234.12 devient dans le système 123412 et c'est seulement à l'affichage qu'il apparaît comme 1234.12.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Un dernier point.

    Pour tester l'égalité on peut remplacer une égalité stricte du type A=B par une égalité "proche" comme abs(A-B)<0.001.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encore un soucis de dérivation de ostream
    Par Bolverk dans le forum SL & STL
    Réponses: 2
    Dernier message: 21/08/2008, 15h03
  2. Encore un souci avec l'arrière-plan Word !
    Par spyto dans le forum Word
    Réponses: 5
    Dernier message: 28/05/2008, 15h24
  3. Encore un soucis avec IServerProvider
    Par r0d dans le forum C++/CLI
    Réponses: 3
    Dernier message: 18/01/2007, 22h28
  4. Encore un souci : Treeview
    Par hunzi dans le forum XMLRAD
    Réponses: 1
    Dernier message: 16/09/2006, 18h12
  5. petit souci d'arrondi
    Par philippef dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/08/2006, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo