89 votes

Conversion des flottants en décimales en Python

Python Decimal ne permet pas d'être construit à partir de float ; il s'attend à ce que vous convertissiez d'abord le float en une chaîne de caractères.

C'est très gênant car les formateurs de chaînes standard pour les flottants exigent que vous indiquiez le nombre de décimales plutôt que le nombre de chiffres significatifs. Ainsi, si vous avez un nombre qui peut avoir jusqu'à 15 décimales, vous devez le formater comme suit Decimal("%.15f" % my_float) qui vous donnera des déchets à la 15ème décimale si vous avez également des chiffres significatifs avant la décimale ( Decimal("%.15f" % 100000.3) == Decimal('100000.300000000002910') ).

Quelqu'un peut-il suggérer une bonne façon de convertir un nombre flottant en une valeur décimale conservant la valeur saisie par l'utilisateur, en limitant éventuellement le nombre de chiffres significatifs pouvant être pris en charge ?

81voto

J.F. Sebastian Points 102961

Python <2.7

"%.15g" % f

Ou en Python 3.0 :

format(f, ".15g")

Python 2.7+, 3.2+.

Il suffit de passer le flotteur à Decimal directement, comme ceci :

from decimal import Decimal
Decimal(f)

35voto

vincent wen Points 48

Je propose ceci

>>> a = 2.111111
>>> a
2.1111110000000002
>>> str(a)
'2.111111'
>>> decimal.Decimal(str(a))
Decimal('2.111111')

32voto

nosklo Points 75862

Vous l'avez dit dans votre question :

Quelqu'un peut-il suggérer convertir de float en Deci la préservation de la valeur en tant que saisi

Mais chaque fois que l'utilisateur saisit une valeur, celle-ci est saisie sous forme de chaîne de caractères et non de flottant. Vous êtes en train de la convertir en flottant quelque part. Convertissez-la plutôt directement en décimal et vous ne perdrez aucune précision.

8voto

Vous pouvez convertir puis quantifier pour conserver 5 chiffres après la virgule via

Decimal(float).quantize(Decimal("1.00000"))

5voto

Federico A. Ramponi Points 23106

La représentation "officielle" d'un flottant est donnée par la fonction repr() :

>>> repr(1.5)
'1.5'
>>> repr(12345.678901234567890123456789)
'12345.678901234567'

Vous pouvez utiliser repr() à la place d'une chaîne formatée, le résultat ne contiendra pas de déchets inutiles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X