Frage

Python Dezimal nicht unterstützt vom Schwimmer ausgebildet ist; es erwartet, dass Sie Schwimmer in einen String zuerst konvertieren.

Das ist sehr unbequem, da Standard-String Formatierer für Schwimmer erfordern, dass Sie Anzahl der Dezimalstellen statt bedeutende Orte angeben. Wenn Sie also eine Zahl, die so viele wie 15 Dezimalstellen haben könnten Sie müssen als Dezimalzahl formatiert werden ( „“%. 15f "% my_float), die Ihnen Müll auf der 15. Dezimalstelle geben, wenn Sie auch keine signifikanten Stellen vor dezimal.

Kann jemand einen guten Weg vorschlagen, um von float zu konvertieren Wert auf Dezimal zu bewahren, wenn der Benutzer eingegeben hat, vielleicht Anzahl der signifikanten Stellen zu begrenzen, die unterstützt werden können?

War es hilfreich?

Lösung

Python <2.7

"%.15g" % f

oder in Python 3.0:

format(f, ".15g")

Python 2.7+, 3,2 +

Sie einfach den Schwimmer passieren Konstruktor direkt an Decimal, wie folgt aus:

from decimal import Decimal
Decimal(f)

Andere Tipps

Du hast gesagt, in Ihrer Frage:

  

Kann jemand einen guten Weg vorschlagen,   konvertieren von float zu Dezimal    Erhaltung Wert als der Benutzer   eingegeben

Aber jedes Mal, wenn der Benutzer einen Wert eingibt, wird es als eine Zeichenfolge eingegeben wird, nicht als Schwimmer. Sie konvertieren es irgendwo zu einem Schwimmer. Wandelt es in eine Dezimal direkt statt und keine Präzision verloren.

Ich schlage vor, diese

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

Python tut Dezimal-Erstellung aus einem Schwimmer unterstützen. Sie werfen es nur als String zuerst. Aber der Genauigkeitsverlust tritt nicht mit String-Konvertierung. Der Schwimmer Sie konvertieren nicht über diese Art von Präzision an erster Stelle. (Sonst würden Sie nicht Dezimal müssen)

Ich denke, hier die Verwirrung ist, dass wir float Literale im Dezimalformat erstellen , aber sobald der Interpreter verbraucht, dass wörtliche die innere Darstellung eine Gleitkommazahl wird.

Die "offizielle" String-Darstellung eines Schwimmers wird durch die repr gegeben () eingebaut:

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

Sie repr () verwenden statt einem formatierten String, wird das Ergebnis keinen unnötigen Müll enthält.

Wenn Sie sagen, „Werterhalt, wenn der Benutzer eingegeben“, warum nicht nur speichern, die vom Benutzer eingegebenen Wert als String, und übergeben Sie, dass an den Dezimal-Konstruktor?

Der „richtigen“ Weg, dies im Jahr 1990 dokumentiert zu tun wurde von Steele und Weißer Sand Clinger der PLDI 1990 Papiere.

Sie können auch sehen diese SO Diskussion über Python Dezimal, einschließlich mein Vorschlag mit so etwas wie frap versuchen, einen Schwimmer zu rationalisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top