Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calculatrice en python : 3.11 + 2.08 = 5.189999995

Sujet résolu
    28 août 2014 à 12:39:35

    Bonjour, :p

    Je suis en train de développer une calculatrice en python, et j'ai un problème :

    Pour effectuer les calculs, j'utilise l'opérateur + de python, mais j'ai un problème : lorsque l'on tape 3.11 + 2.08, on obtient 5.18999999999995

    Je voudrais donc éviter d'avoir ce résultat approximatif.

    Merci d'avance,

    Au revoir

    • Partager sur Facebook
    • Partager sur Twitter
      28 août 2014 à 12:50:36

      C'est normal. Ça fait ça pour tout le monde. Il existe plusieurs solutions:

      a = 3.11 + 2.08
      
      #Utiliser la fonction round()
      b = round(a, 2)  #renvoie un nombre avec 2 décimales
      
      #utiliser la méthode format() de la classe str()
      b = "{:.2f}".format(a)  #renvoie une chaîne de caractères
      b = float(b)  #convertit la chaîne en flottant
      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        28 août 2014 à 13:51:01

        Je t'invite à lire cette page très instructive sur la virgule flottante en python :)

        Si ton souci se situe au niveau de l'affichage simplement, plein de méthodes sont possibles pour n'afficher qu'un certain nombre de chiffres après la virgule. Sinon, ne t'en fais pas trop. Les erreurs d'arrondis en calcul à virgule flottante sont un sujet de recherches aujourd'hui encore (sujet par ailleurs très intéressant), et cela ne devrait pas te poser de problème fondamental dans le développement de ta calculatrice ^^

        • Partager sur Facebook
        • Partager sur Twitter
          28 août 2014 à 14:22:54

          Le problème vient de l'approximation binaire (edit: doublé par Mustiwa). Je vois deux moyens pour la contourner:

          1 - utiliser le module `decimal`

          >>> import decimal
          >>> D = decimal.Decimal
          >>> D("3.11") + D("2.08")
          Decimal('5.19')

          Attention de bien passer le nombre en str au constructeur de Decimal, si tu les passes en float tu auras quand même une approximation.

          Avec decimal, tu peux aussi régler le nombre de chiffres significatifs:

          getcontext().prec = 50  # Utiliser 50 chiffres significatifs

          2 - N'utiliser que des `int`(ou des `long` en python 2), avec des exposants si nécessaire. C'est beaucoup plus complexe à utiliser mais tu as une précision infinie

          >>> def addition(x, y):
              exposant = min((x[1], y[1]))
              x = [x[0] * 10**(x[1]-exposant), exposant]
              y = [y[0] * 10**(y[1]-exposant), exposant]
          
              return [x[0] + y[0], exposant]
          
          >>> a = [311,  -2]  # 311  * 10**-2 == 3.11
          >>> b = [2085, -3]  # 2085 * 10**-3 == 2.085
          >>> addition(a, b)
          [5195, -3]  # 5.195

          Tu peux bien sûr utiliser un objet plutôt qu'une liste, pour pouvoir surcharger les opérateurs.

          inconvénients (outre la difficulté d'utilisation):

          - tu dois régulièrement simplifier le nombre (ex: 311000*10**-5 == 311*10**-2) sinon les calculs sont de plus en plus coûteux en temps et en mémoire.

          - il est très difficile de gérer les divisions : 10/3 vaut-il 3,  3333*10**-3 ou 33333333333*10**-10 ?



          -
          Edité par tatrats 28 août 2014 à 14:25:45

          • Partager sur Facebook
          • Partager sur Twitter
            28 août 2014 à 19:27:43

            Bonjour, et merci à tous pour vos nombreuses réponses :p !

            Olygrim :

            Je préférerais éviter d'arrondir les nombres...

            Mustiwa :

            Merci pour le lien, la page est plutôt intéressante.

            tatrats :

            Je vais utiliser le module décimal.

            -----------------------------------------------------------------

            Merci de votre aide ! :D

            Problème résolut !!! :p

            -
            Edité par Adrien++ 28 août 2014 à 19:42:32

            • Partager sur Facebook
            • Partager sur Twitter

            Calculatrice en python : 3.11 + 2.08 = 5.189999995

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown