Question

Python Decimal ne prend pas en charge la construction à partir de float; il s'attend à ce que vous deviez convertir d'abord float en chaîne.

Cela est très gênant, car les formateurs de chaîne standard pour float exigent que vous spécifiiez le nombre de décimales plutôt que des espaces significatifs. Donc, si vous avez un nombre qui peut avoir jusqu’à 15 décimales, vous devez utiliser le format Décimal (& "; &";%. 15f & "% Mon_float), ce qui vous laissera un la quinzième décimale si vous avez également des chiffres significatifs avant décimale.

Quelqu'un peut-il suggérer un bon moyen de convertir les valeurs flottantes en valeurs décimales conservées à la saisie de l'utilisateur, en limitant peut-être le nombre de chiffres significatifs pouvant être pris en charge?

Était-ce utile?

La solution

Python < 2.7

"%.15g" % f

Ou en Python 3.0:

format(f, ".15g")

Python 2.7+, 3.2 +

Il suffit de passer le float directement au Decimal constructeur, comme suit:

from decimal import Decimal
Decimal(f)

Autres conseils

Vous avez dit dans votre question:

  

Quelqu'un peut-il suggérer un bon moyen de   convertir de float en décimal    en préservant la valeur que l'utilisateur a   entré

Mais chaque fois que l'utilisateur entre une valeur, celle-ci est entrée en tant que chaîne et non en tant que float. Vous le convertissez en un flotteur quelque part. Convertissez-le directement en décimal et aucune précision ne sera perdue.

Je suggère ceci

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

Python prend en charge la création décimale à partir d'un float. Vous venez de le lancer comme une chaîne en premier. Mais la perte de précision ne se produit pas avec la conversion de chaîne. Le float que vous convertissez n'a pas ce genre de précision en premier lieu. (Sinon vous n’auriez pas besoin de décimal)

Je pense que la confusion est que nous pouvons créer des littéraux flottants au format décimal , mais dès que l'interprète utilise ce littéral, la représentation interne devient un nombre à virgule flottante.

Le "ient officiel " La représentation sous forme de chaîne d'un float est donnée par la commande intégrée 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.

Lorsque vous dites & "conserver la valeur lorsque l'utilisateur a entré &", pourquoi ne pas stocker la valeur saisie par l'utilisateur sous forme de chaîne et la transmettre au constructeur Decimal?

Le " right " Cette méthode a été décrite en 1990 par Steele et White's et Documents de PLinger 1990 de Clinger.

Vous pouvez également consulter la cette discussion SO sur Python Decimal, y compris Ma suggestion d'essayer d'utiliser quelque chose comme frap pour rationaliser un float.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top