Konvertieren Sie die Gleitkommazahl in eine bestimmte Genauigkeit und kopieren Sie sie in eine Zeichenfolge

144

Ich habe beispielsweise eine Gleitkommazahl 135.12345678910. Ich möchte diesen Wert mit einer Zeichenfolge verknüpfen, möchte aber nur 135.123456789. Mit print kann ich dies einfach tun, indem ich Folgendes mache:

print "%.9f" % numvar

mit numvarmeiner ursprünglichen Nummer zu sein. Gibt es eine einfache Möglichkeit, dies zu tun?

pauliwago
quelle
2
% macht das genau -% ist nicht Teil der Druckfunktion, sondern der Zeichenfolge - siehe Python-Dokumente
michael_s

Antworten:

177

Bei Python <3 (z. B. 2.6 [siehe Kommentare] oder 2.7) gibt es zwei Möglichkeiten.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Beachten Sie jedoch, dass für Python-Versionen über 3 (z. B. 3.2 oder 3.3) Option zwei bevorzugt wird .

Für weitere Informationen zu Option zwei empfehle ich diesen Link zur Formatierung von Zeichenfolgen aus der Python-Dokumentation .

Für weitere Informationen zu Option 1 reicht dieser Link aus und enthält Informationen zu den verschiedenen Flags .

Python 3.6 (offiziell im Dezember 2016 veröffentlicht) hat das fString-Literal hinzugefügt. Weitere Informationen finden Sie hier , wodurch die str.formatMethode erweitert wird (Verwendung von geschweiften Klammern, um f"{numvar:.9f}"das ursprüngliche Problem zu lösen).

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

löst das Problem. Weitere Informationen finden Sie in der Antwort von @ Or-Duan. Diese Methode ist jedoch schnell .

HAL 9001
quelle
1
Option zwei sollte sein newer_method_string = "{:.9f}".format(numvar)- beachten Sie die erforderlichen :, um das Feld und die Formatierung zu trennen. Ich habe das sowieso auf 2.7.5 getestet.
Caltor
1
Für Python 2.6 sollte Option zwei sein newer_method_string = "{0:.9f}".format(numvar)- notieren Sie die erforderliche 0 für den Feldnamen für diese ältere Version.
ttq
56

Python 3.6

Um dies zu verdeutlichen, können Sie die F-String- Formatierung verwenden. Dies hat fast die gleiche Syntax wie die formatMethode, macht es aber ein bisschen schöner.

Beispiel:

print(f'{numvar:.9f}')

Lesen Sie mehr über die neue f-Saite:

Hier ist ein Diagramm der Ausführungszeiten der verschiedenen getesteten Methoden (vom letzten Link oben):

Ausführungszeiten

Oder Duan
quelle
52

Verwenden von round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
Shantanoo
quelle
8

Es ist kein Druck, der die Formatierung übernimmt. Es ist eine Eigenschaft von Zeichenfolgen, sodass Sie sie einfach verwenden können

newstring = "%.9f" % numvar
John La Rooy
quelle
Oder verwenden Sie die neue Formatierung. valueString = "{:. 9f}". Format (Nummer)
Zaren
8

Falls die Genauigkeit erst zur Laufzeit bekannt ist, ist diese andere Formatierungsoption hilfreich:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'
Yu Hao
quelle
3
Wenn Sie -method bevorzugen .format, beachten Sie, dass dies auch durch Verschachteln von Argumenten wie folgt erfolgen kann : '{:.{n}f}'.format(numvar,n=n).
Nivk
2

Um die Genauigkeit mit 9 Stellen einzustellen, erhalten Sie:

print "%.9f" % numvar

Rückgabegenauigkeit mit 2 Ziffern:

print "%.2f" % numvar 

Rückgabegenauigkeit mit 2 Ziffern und Float-konvertiertem Wert:

numvar = 4.2345
print float("%.2f" % numvar) 
Tejas Panzer
quelle
-2

Die strFunktion hat einen Fehler. Bitte versuche folgendes. Sie sehen '0,196553', aber die richtige Ausgabe ist '0,196554'. Weil der strStandardwert der Funktion ROUND_HALF_UP ist.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")
ethemsulan
quelle
2
Was ist los mit .vs. ,Und wie ist es für Pauliwagos Frage relevant?
Peter Mortensen