2009-01-02 7 views
5

Mon code:en virgule flottante Limitations

a = '2.3' 

je voulais afficher a comme une valeur en virgule flottante.

Depuis a est une chaîne, j'ai essayé:

float(a) 

Le résultat je suis arrivé était:

2.2999999999999998 

Je veux une solution à ce problème. S'il vous plaît, aidez-moi avec bonté.

Je suivais this tutorial.

+0

@ rejinacm.myopenid.com: vous voudrez peut-être supprimer le commentaire "Ceci est un inconvénient de Python." ! –

+8

-1 aux freaks qui ont rabaissé cette question au lieu de la réparer! –

+1

Dupliquer: http://stackoverflow.com/questions/286061/python-decimal-place-issues-with-floats, http://stackoverflow.com/questions/286061/python-decimal-place-issues-with-floats –

Répondre

18

Je pense que cela reflète plus votre compréhension des types à virgule flottante que sur Python. Voir my article about floating point numbers (basé sur .NET, mais toujours pertinent) pour les raisons de cette "inexactitude". Si vous devez conserver la représentation décimale exacte, vous devez utiliser le decimal module.

+0

décimal renvoie une chaîne.Je veux un type flottant uniquement. – user46646

+0

@rejinacm - les types de flotteurs ne sont pas exacts, votre papier explique réellement cela à la fin et explique pourquoi cela se produit. –

+0

Decimal ne "renvoie" pas une chaîne - vous pouvez * la convertir en chaîne, mais une valeur décimale est juste une valeur, que vous pouvez manipuler séparément, etc. Si vous avez vraiment besoin de flotter pour une raison quelconque, vous devez accepter que vous n'allez pas pouvoir y représenter exactement 2.3. –

6

Ce n'est pas un inconvénient de python, c'est plutôt un inconvénient de la façon dont les nombres à virgule flottante sont stockés sur un ordinateur. Quel que soit le langage de mise en œuvre, vous trouverez des problèmes similaires.

Vous dites que vous voulez 'afficher' A comme une virgule flottante, pourquoi ne pas simplement afficher la chaîne? Visuellement, il sera identique à ce que vous attendez. Comme Jon l'a mentionné, si vos besoins ne se contentent pas d'afficher le nombre à virgule flottante, vous devez utiliser le module décimal pour stocker la représentation exacte.

4

Excellentes réponses expliquant les raisons. Je voudrais juste ajouter une solution pratique possible de la bibliothèque standard:

>>> from decimal import Decimal 
>>> a = Decimal('2.3') 
>>> print a 
2.3 

Ceci est en fait un (très) F.A.Q. pour Python et vous pouvez read the answer here. Edit: Je viens de remarquer que John Skeet l'a déjà mentionné. Eh bien ...

Questions connexes