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

Excel Discussion :

Excel fait une erreur de calcul !


Sujet :

Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut Excel fait une erreur de calcul !
    Bonjour,
    J'ai une colonne remplie de montants (nombres à 2 décimales, donc). Lorsque Excel en calcule la somme, il trouve (si je demande l'affichage de 10 décimales) 97243.7999999999 (au lieu de 97243.80).
    Et comme j'ai un programme VBA qui contrôle l'égalité des sommes de 2 colonnes, d'un côté, il trouve 97243.7999999999 (par erreur) et de l'autre 97243.8000000000 ... et, donc, conclut, à tort, à l'inégalité !
    Quelqu'un peut-il m'expliquer l'origine du problème ?
    Merci !

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Quand tu demandes à Excel un affichage à 2 décimales, ce n'est que l'affichage qui change, pas la valeur contenue par la cellule.

    Par exemple, si tu as 1,003 dans une cellule et dans une autre le résultat de cette cellule multipliée par 4.
    Si, pour ces deux cellules, tu demandes un format d'affichage à deux décimales, tu auras "1" dans la première cellule et "4,1" dans la seconde, ce qui pourra laisser penser un peu vite à une erreur de calcul. L'erreur n'est qu'apparente, en réalité le calcul est juste.

    Si tu veux éviter ça, il faut que tu encadres toutes les formules pouvant générer des décimales (en particulier les divisions et autres fonctions du genre) d'une fonction ARRONDI ou l'une de ses petites cousines (ARRINDI.INF, ARRONDI.SUP,PLAFOND, PLANCHER, ENT, etc.).
    Ces fonction vont réellement transformer ton résultat en une valeur à deux décimales.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour, bonjour !

    En fait VBA ne fait pas d'erreur : il exécute juste les lignes du développeur n'utilisant pas un type de variable approprié,
    la source du problème est donc entre la chaise et le clavier !

    Comme le prouve cette démonstration

    __________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    __________________________________________________________________________________________________
    Tous unis, tous Charlie
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Merci à vous deux pour vos réponses.
    En fait, je vous soumets un problème qui m'a été soumis (par mail) ! ... et, donc, je ne sais pas, en particulier, si l' "erreur" se produit dans VBA seulement ou si elle se produit dans VBA et dans Excel.

    Par contre, je ne comprends pas bien la logique du 2e calcul de ta démonstration, Marc-L : pourquoi, si le résultat de la formule est de type Variant, le résultat obtenu ne correspond pas à celui attendu ?

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par jlp65 Voir le message
    En fait, je vous soumets un problème qui m'a été soumis (par mail) ! ...
    Il est préférable qu'il y ait le moins d'intermédiaires pour résoudre un problème parce qu'il y a forcément perte d'information (sans parle de perte de temps) à chaque étape.
    Il vaudrait donc mieux que ce soit celui qui rencontre ce problème qui vienne en parler.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Il est préférable qu'il y ait le moins d'intermédiaires pour résoudre un problème parce qu'il y a forcément perte d'information (sans parle de perte de temps) à chaque étape.
    Il vaudrait donc mieux que ce soit celui qui rencontre ce problème qui vienne en parler.
    Effectivement ... Mais si l'on pouvait m'expliquer le résultat du 2e calcul de la démonstration de Marc-L, cela m'intéresserait !

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Il n'y a qu'un seul calcul dans la démonstration !

    Comme déjà indiqué, le résultat du calcul diffère selon le type de variable employé …

    __________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour Marc-L, le forum,

    Je ne comprends pas pourquoi la variable Double pose soucis...
    J'imagine que ceci est dû à la différence entre :
    Single : Type de données qui regroupe des variables à virgule flottante en simple précision sous forme de nombres à virgule flottante [...]
    et ...
    Double : Type de données stockant sur 64 bits les nombres à virgule flottante en double précision [...]
    ... mais je ne comprends pas.

    Peux-tu m’éclairer ?
    Merci.

    Cordialement,
    Kimy

    [EDIT : @jlp65, au passage, c'est sur qu'avec un titre comme celui que tu as mis, tu allais avoir du passage sur ton post. ^^ Comme l'a dit Marc-L, l'erreur ne se situe jamais après le clavier ! ]
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    La précision de calculs est expliquée dans l'aide d'Excel et plus techniquement sur un site Microsoft.
    En gros, certaines valeurs décimales n'ont pas d'équivalence juste en représentation binaire (interne) …
    Ce n'est pas spécifique à Excel, peut se rencontrer dans d'autres applications ou langages.

    Par contre se méfier de la fonction VBA Round, voir ma procédure Test dans la page précédant la démonstration !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 210
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par Kimy_Ire Voir le message
    [EDIT : @jlp65, au passage, c'est sur qu'avec un titre comme celui que tu as mis, tu allais avoir du passage sur ton post. ]
    Je comptais bien dessus !

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Et tu as été servi !
    Conformément aux règles du forum :

    __________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Juste pour conclure, je trouve ce lien relativement explicite sur le sujet.
    Je ne sais pas s'il s'agit d'être aussi radical, cependant, au vu de ma nécessité de précision de manière générale, je n'utiliserais plus les Double.

    Merci Marc-L.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  13. #13
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Etrange conclusion...
    Par recherche de précision, refuser d'utiliser le type de variable qui offre le plus de précision.
    Il est préférable, si on veut un nombre à deux chiffres après la virgule, d'utiliser des fonctions qui garantissent ce type de résultats. Excel et VBA en ont plusieurs, à commencer par les fonctions d'arrondi. Avec ça, au moins, on est sûr de faire du travail propre.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  14. #14
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Ça dépend de ce qu'on fait. Si on fait du calcul scientifique, oui le double est plus précis. Si on fait de la compta, je préfère mon petit chéri le Currency(qui n'est qu'en entier très long avec une virgule arbitrairement postée à 4 décimales du bord droit).
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  15. #15
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Quand je fais des calculs sur des sommes d'argent, je préfère personnellement agrémenter les formules de ARRONDI(), ARRONDI.SUP() ou ARRONDI.INF(), que ce soit dans les formules Excel ou en VBA. Avec ça, il n'y a aucune incertitude sur le résultat obtenu.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/05/2007, 11h31
  2. [VC++2005 express] deux projets identiques, l'un me fait une erreur
    Par méphistopheles dans le forum Visual C++
    Réponses: 4
    Dernier message: 16/01/2007, 07h24
  3. fonction qui me fait une erreur
    Par griese dans le forum Langage
    Réponses: 12
    Dernier message: 28/07/2006, 09h46
  4. mktime me fait une erreur
    Par mail1789 dans le forum C++
    Réponses: 2
    Dernier message: 23/08/2005, 09h59
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

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