a = 1

for x in range(5):
    a += 0.1
    print(a)

Voici le résultat:

1.1
1.2000000000000002
1.3000000000000003
1.4000000000000004
1.5000000000000004

Comment puis-je réparer cela? La fonction round() est-elle le seul moyen? Puis-je définir la précision d'une variable avant de définir sa valeur?

2
0rhodabasi 4 mars 2016 à 23:32

4 réponses

Meilleure réponse

puis-je définir la précision d'une variable avant de définir la valeur?

Utilisez le module decimal qui, contrairement à float(), offre une précision arbitraire et peut représenter des nombres décimaux exactement:

>>> from decimal import Decimal, getcontext
>>> 
>>> getcontext().prec = 5
>>> 
>>> a = Decimal(1)
>>> 
>>> for x in range(5):
...     a += Decimal(0.1)
...     print(a)
... 
1.1000
1.2000
1.3000
1.4000
1.5000
4
Chris 4 mars 2016 à 20:39

La sortie formatée a été dûment suggérée par @Jaco. Cependant, si vous voulez contrôler la précision de votre variable au-delà de la sortie pure, vous voudrez peut-être regarder le module decimal.

from decimal import Decimal

a = 1
for x in range(3):
    a += Decimal('0.10')  # use string, not float as argument
    # a += Decimal('0.1000')
    print(a)  # a is now a Decimal, not a float

> 1.10  # 1.1000
> 1.20  # 1.2000
> 1.30  # 1.3000
1
schwobaseggl 4 mars 2016 à 20:43

En supposant que votre problème n'affiche que le numéro, la réponse de @Jaco fait le travail. Cependant, si vous souhaitez utiliser cette variable et potentiellement faire des comparaisons ou attribuer des clés de dictionnaire, je dirais que vous devez vous en tenir à round (). Par exemple, cela ne fonctionnerait pas:

a = 1
for x in range(5):
    a += 0.1
    print('%.1f' % a)
    if a == 1.3:
        break

1.1
1.2
1.3
1.4
1.5

Il faudrait faire:

a = 1
for x in range(5):
    a += 0.1
    print('%.1f' % a)
    if round(a, 1) == 1.3:
        break

1.1
1.2
1.3
1
Raf 4 mars 2016 à 20:42

Vous pouvez formater votre sortie comme ceci;

a=1
for x in range(5):
    a += 0.1
    print("{:.9f}".format(a) )
2
Alex 4 mars 2016 à 20:36