Problème de somme

loki9678 -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je dois faire un travail d'informatique en utilisant python. Cependant durant mon développement du code je suis tombé sur une erreur plutôt bizarre . Voici le bout de mon programme qui bug :

k=0.0
while k <= 10:
    print(k)
    k=k+0.1



Je souhaite donc vérifier si l'évolution de ma variable k se fait bien, donc en théorie je devrait obtenir 0.0, 0.1, 0.2,...,9.8, 9.9, 10.0
Cependant voici ce que j'obtient :

0.0
0.1
0.2
0.30000000000000004
.
.
.
1.4000000000000001
1.5000000000000002
.
.
.
2.500000000000001
2.600000000000001
.
.
.
4.699999999999999
4.799999999999999
4.899999999999999
4.999999999999998
5.099999999999998
5.1999999999999975
5.299999999999997
5.399999999999997
.
.
.
8.699999999999985
.
.
.
9.89999999999998
9.99999999999998


Très vite les valeurs ont des décimales qui apparaissent de nulles part et donc l'évolution de ma variable k est bizarre
Je ne suis pas habitué à utiliser python mais pour le coup je ne comprend pas d'où pourrait venir l'erreur
Si quelqu'un peut m'éclairer svp ca serait génial :)
Merci

3 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour
    Je me demande si ca ne serait pas un souci (connu ?) des nombres floatant..
    Peux tu tester comme ceci ?
    k= (k*10+1)/10

    0
    1. loki9678
       
      Je viens d'essayer comme cela et ça fonctionne très bien. Merci beaucoup.
      L'idée c'est de toujours passer par un nombre entier d'abord et ensuite de diviser par 10 par exemple pour revenir sur un réel ?
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > loki9678
         
        Oui
        C'est un "bug" courant en programmation sur l'addition ou la soustraction de nombres de rype float.
        Et donc Par 10 ou par 100 (selon le nombre de decimales désirées)
        0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    Python travaille en binaire, et 0.1 n'est donc pas exactement égal à ce que tu imagines, ce qui explique ce comportement.
    Si tu veux travailler en décimal:
    import decimal
    ud=decimal.Decimal(1)/decimal.Decimal(10)
    k=decimal.Decimal(0)
    while k <= 10:
        print(k)
        k=k+ud
    0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour yg_be,

    En executant
    print(decimal.Decimal(1))


    j'ai l'erreur: AttributeError: 'int' object has no attribute 'Decimal'
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      code complet?
      tu n'aurais pas une variable qui s'appelle
      decimal
      ?
      0
      1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bien vu !

        En fait j'avais copié ton code dans un fichier fourre-tout maths.py qui me sert à faire des tests ...

        Sinon, ça n'est pas vraiment un bug, c'est simplement la représentation en interne des nombres décimaux
        Par exemple, on ne fais jamais, avec des float :

        if(a==b):

        ou:
        if(a>b):


        J'utilise plutôt des petites fonctions du style:

        TOL = 0.000001
        
        def is_equal(v1,v2):
            ''' Checks if v1 == v2 '''
        
            if(abs(v1-v2) < TOL):
                return(True)
            else:
                return(False)
        0