Problème de somme

loki9678 -  
Phil_1857 Messages postés 1956 Statut Membre -
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
A voir également:

3 réponses

jordane45 Messages postés 40050 Date d'inscription   Statut Modérateur Dernière intervention   4 758
 
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
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
jordane45 Messages postés 40050 Date d'inscription   Statut Modérateur Dernière intervention   4 758 > 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
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 585
 
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
Phil_1857 Messages postés 1956 Statut Membre 168
 
Bonjour yg_be,

En executant
print(decimal.Decimal(1))


j'ai l'erreur: AttributeError: 'int' object has no attribute 'Decimal'
0
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 585
 
code complet?
tu n'aurais pas une variable qui s'appelle
decimal
?
0
Phil_1857 Messages postés 1956 Statut Membre 168 > yg_be Messages postés 24281 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