it-swarm.com.de

Python Float to Decimal-Konvertierung

Python Decimal unterstützt es nicht, aus float erstellt zu werden. Es wird erwartet, dass Sie zuerst float in einen String konvertieren müssen.

Dies ist sehr unpraktisch, da Standardzeichenfolgenformatierer für float die Angabe der Anzahl von Dezimalstellen anstelle von signifikanten Stellen erfordern. Wenn Sie also eine Zahl mit bis zu 15 Dezimalstellen haben, müssen Sie diese als Dezimalzahl formatieren (""%. 15f "% my_float). Dies führt zu Müll auf der 15. Dezimalstelle, wenn Sie zuvor auch signifikante Stellen haben Dezimal.

Kann jemand eine gute Möglichkeit vorschlagen, den vom Benutzer eingegebenen Wert von float in Decimal zu konvertieren, um die Anzahl der unterstützten signifikanten Stellen zu begrenzen?

49
Kozyarchuk

Python <2.7

"%.15g" % f

Oder in Python 3.0:

format(f, ".15g")

Python 2.7+, 3.2+

Übergeben Sie den float einfach direkt an den Konstruktor Decimal:

from decimal import Decimal
Decimal(f)
52
jfs

Sie sagten in Ihrer Frage:

Kann jemand einen guten Weg vorschlagen, um von float nach Decimal zu konvertieren Wert beibehalten, wie der Benutzer eingegeben hat

Jedes Mal, wenn der Benutzer einen Wert eingibt, wird dieser als Zeichenfolge und nicht als Gleitkomma eingegeben. Sie wandeln es irgendwo in einen Schwimmer um. Konvertieren Sie es stattdessen direkt in eine Dezimalzahl und es geht keine Genauigkeit verloren.

23
nosklo

Ich schlage das vor

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

Python unterstützt die Erstellung von Dezimalzahlen aus einem Float. Du wirfst es einfach zuerst als Zeichenfolge. Der Genauigkeitsverlust tritt jedoch bei der String-Konvertierung nicht auf. Der Schwimmer, den Sie konvertieren, hat nicht unbedingt diese Präzision. (Sonst bräuchten Sie keine Dezimalzahl)

Ich denke, die Verwirrung hier ist, dass wir können Float-Literale im Dezimalformat erstellen, aber sobald der Interpreter dieses Literal verbraucht, wird die innere Darstellung eine Gleitkommazahl.

4
muhuk

Die "offizielle" String-Darstellung eines Floats ergibt sich aus dem eingebauten repr ():

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

Sie können repr () anstelle einer formatierten Zeichenfolge verwenden. Das Ergebnis enthält keinen unnötigen Müll.

3

Wenn Sie "Wert beibehalten, wie der Benutzer ihn eingegeben hat" sagen, warum nicht einfach den vom Benutzer eingegebenen Wert als Zeichenfolge speichern und diesen an den Decimal-Konstruktor übergeben?

2
Paul Fisher

Der "richtige" Weg, dies zu tun, wurde 1990 durch Steele und White's und Clinger's PLDI 199 Papiere dokumentiert.

Sie können auch this SO Diskussion über Python Decimal, einschließlich meines Vorschlags, etwas wie frap einen Schwimmer rationalisieren.

0
Doug Currie