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

Macros et VBA Excel Discussion :

Perte de précision lors de calculs simples


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Par défaut Perte de précision lors de calculs simples
    Bonsoir le forum,

    J'ai une petit problème que j'ai résolu d'une façon qui ne me plaît pas trop et j'aimerai trouver une solution propre.

    Voilà un extrait de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Incrementlinf As Single
    Public Incrementlsup As Single
    Public NbIncrementl As Single
     
     
    Incrementlinf = Int(var5 * (1 - (ErreurCapteurGas) / 100) * 10) * 0.1
    Incrementlsup = Int(var5 * (1 + (ErreurCapteurGas) / 100) * 10) * 0.1
     
    NbIncrementl = Incrementlsup - Incrementlinf
    La manip Int(Nombre*10)*0.1 me permet d'avoir un nombre avec une seule décimale.

    La dernière étape fait une simple soustraction, mais je ne me retrouve pas avec un nombre à une seule décimale, mais avec plusieurs.

    Par exemple, en break mode je lis:

    2.4-1.2=1.199999

    Le problème est que je ne peux pas travailler avec ces valeurs dans la suite du code.

    J'ai donc contourné le problème en déclarant toutes les variables en String, mais je pense qu'il y a mieux.

    Quelqu'un a-t-il déjà eu ce problème? Y-a-t-il une solution propre?

    Bonne soirée et merci.

    Sankae.

  2. #2
    Expert éminent
    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
    Par défaut
    Bonjour,

    c'est normal, Single à éviter, lui préférer le type Double


    __________________________________________________________________________________________

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

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Bonjour,

    Sauf que le type double ne fait que reculer le problème., aucune représentation de nombres réels ne donne des calculs exacts, c'est strictement impossible à implémenter.

    Pour des calculs exacts, seuls les types entiers conviennent. On peut généralement se débrouiller pour faire avec (par exemple, ici il faut une seule décimale : on prend un entier multiplié par 10 pour les calculs, et on gère le fait qu'on a fait cette multiplication).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Par exemple, en break mode je lis:

    2.4-1.2=1.199999
    Bizarre puisque tu forces le passage à un entier.

    Peut-être que la fonction 'Round' peut t'aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Incrementlinf = Round(Int(var5 * (1 - (ErreurCapteurGas) / 100) * 10) * 0.1, 1)
    Incrementlsup = Round(Int(var5 * (1 + (ErreurCapteurGas) / 100) * 10) * 0.1, 1)

  5. #5
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut perte de précision lors de calculs simples
    Bonjour,

    Outre que la chose semble effectivement impossible, ne serait-il pas plus simple de mettre l'entier ou l'arrondi (pas utile de faire les deux) uniquement dans la soustraction. Tu y gagnerais en précision me semble-t-il.

    Avec quelles valeurs de var5 et ErreurCapteurGas obtiens-tu ce résultat improbable ?

    cordialement.

  6. #6
    Membre averti
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Par défaut
    J'ai essayé en déclarant mes variables en Double. Il y a toujours un effet indésirable, mais cette fois-ci il ne m'empêche pas de continuer. Je pense que je vais faire avec.

    Par exemple, en prenant var5=20 et ErreurCapteurGas=2 j'obtiens

    20.4-19.6=0.800000000000000001 si les variables sont en Double

Discussions similaires

  1. [Python 3.X] Etrange erreur lors d'un calcul simple - Débutant - Exercice
    Par Mooks67 dans le forum Général Python
    Réponses: 9
    Dernier message: 28/05/2015, 22h25
  2. Réponses: 10
    Dernier message: 22/11/2005, 00h05
  3. [MySQL] Perte d'information lors d'une requête de visualisation
    Par niccco dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 21/10/2005, 14h46
  4. [GD] probleme de perte de qualité lors de miniature de photos?
    Par brasco06 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 23/05/2005, 17h03
  5. Calcul simple pour code couleur
    Par Boumeur dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 16/04/2005, 11h51

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