Wie kann ich einen Float so formatieren, dass er keine nachgestellten Nullen enthält? Mit anderen Worten, ich möchte, dass die resultierende Zeichenfolge so kurz wie möglich ist.
Beispielsweise:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
3.14 == 3.140
- Sie sind die gleiche Gleitkommazahl. Im Übrigen ist 3.140000 dieselbe Gleitkommazahl. Die Null existiert überhaupt nicht.%0.2f
und%0.3f
sind die beiden Formate, die erforderlich sind, um die letzten Zahlen auf der linken Seite zu erzeugen. Verwenden Sie%0.2f
diese Option , um die letzten beiden Zahlen rechts zu erzeugen.3.0 -> "3"
ist immer noch ein gültiger Anwendungsfall.print( '{:,g}'.format( X )
arbeitete für mich, um auszugeben,3
woX = 6 / 2
und wannX = 5 / 2
ich eine Ausgabe von2.5
wie erwartet bekam.print("%s"%3.140)
gibt dir was du willst. (Ich habe unten unten eine Antwort hinzugefügt ...)Antworten:
Ich würde es tun
('%f' % x).rstrip('0').rstrip('.')
- garantiert eine Festkomma-Formatierung anstelle einer wissenschaftlichen Notation usw. usw. Ja, nicht so schick und elegant wie%g
, aber es funktioniert (und ich weiß nicht, wie ich zwingen soll%g
, niemals wissenschaftliche Notation zu verwenden; -).quelle
'%.2f' % -0.0001
, dass Sie mit-0.00
und letztendlich verlassen werden-0
.'f' Fixed point. Displays the number as a fixed-point number. The default precision is 6.
In der obigen Lösung müssten Sie '% 0.7f' verwenden.'%0.15f'
es eine schlechte Idee ist , die Präzision oben zu erhöhen , weil seltsame Dinge passieren.print('In the middle {} and something else'.format('{:f}'.format(a).rstrip('0')))
rstrip
Befehl los . Verwenden Sie stattdessen einfach dies, um sowohl den Punkt (.
) als auch alle nachfolgenden Nullen anschließend in einer Operation('%f' % x).rstrip('.0')
Sie könnten dies verwenden
%g
, um dies zu erreichen:oder für Python 2.6 oder besser:
Aus den Dokumenten für
format
:g
Ursachen (unter anderem)quelle
'{0:...}'.format(value)
wenn Sie verwenden könntenformat(value, '...')
? Dadurch muss der Formatbezeichner nicht aus einer ansonsten leeren Vorlagenzeichenfolge analysiert werden.format(v, '2.5f')
~ 10% länger gedauert als'{:2.5f}'.format(v)
. Selbst wenn dies nicht der Fall ist, verwende ich in der Regel dasstr
Methodenformular, da es weniger zu ändern gibt, wenn ich es optimieren, zusätzliche Werte hinzufügen usw. muss. Natürlich haben wir ab 3.6 für die meisten Zwecke F-Strings. :-)f"{var:g}"
wovar
eine Variable vom Typ float.Was ist mit dem einfachsten und wahrscheinlich effektivsten Ansatz? Die Methode normalize () entfernt alle am weitesten rechts stehenden Nullen.
Funktioniert in Python 2 und Python 3 .
-- Aktualisiert --
Das einzige Problem, wie @ BobStein-VisiBone hervorhob, ist, dass Zahlen wie 10, 100, 1000 ... in exponentieller Darstellung angezeigt werden. Dies kann einfach mit der folgenden Funktion behoben werden:
quelle
Decimal('10.0').normalize()
wird'1E+1'
Nachdem ich mir die Antworten auf einige ähnliche Fragen angesehen habe, scheint dies die beste Lösung für mich zu sein:
Meine Argumentation:
%g
wird die wissenschaftliche Notation nicht los.15 Dezimalstellen scheinen seltsames Verhalten zu vermeiden und haben viel Präzision für meine Bedürfnisse.
Ich hätte
format(inputValue, '.15f').
stattdessen verwenden können'%.15f' % inputValue
, aber das ist etwas langsamer (~ 30%).Ich hätte es gebrauchen können
Decimal(inputValue).normalize()
, aber das hat auch ein paar Probleme. Zum einen ist es VIEL langsamer (~ 11x). Ich fand auch heraus, dass es, obwohl es eine ziemlich hohe Präzision aufweist, bei der Verwendung immer noch unter Präzisionsverlust leidetnormalize()
.Am wichtigsten ist, dass ich immer noch
Decimal
von einem konvertieren würde,float
was dazu führen kann, dass Sie etwas anderes als die Nummer erhalten, die Sie dort eingegeben haben. Ich denke,Decimal
funktioniert am besten, wenn die Arithmetik erhalten bleibtDecimal
und dieDecimal
mit einer Zeichenfolge initialisiert wird.Ich bin mir sicher, dass das Präzisionsproblem von
Decimal.normalize()
mithilfe der Kontexteinstellungen an die Anforderungen angepasst werden kann, aber angesichts der ohnehin langsamen Geschwindigkeit, die keine lächerliche Präzision erfordert, und der Tatsache, dass ich immer noch von einem Float konvertieren und trotzdem an Präzision verlieren würde, habe ich es nicht getan Ich glaube nicht, dass es sich gelohnt hat, sie zu verfolgen.Ich bin nicht besorgt über das mögliche "-0" -Ergebnis, da -0.0 eine gültige Gleitkommazahl ist und es wahrscheinlich sowieso selten vorkommt, aber da Sie erwähnt haben, dass Sie das String-Ergebnis so kurz wie möglich halten möchten, Sie könnte immer eine zusätzliche Bedingung bei sehr geringen zusätzlichen Geschwindigkeitskosten verwenden.
quelle
floatToString(12345.6)
gibt'12345.600000000000364'
zum Beispiel zurück. Wenn Sie die 15 in%.15f
auf eine niedrigere Zahl verringern, wird dies in diesem Beispiel gelöst. Dieser Wert muss jedoch immer weiter verringert werden, wenn die Zahl größer wird. Es könnte dynamisch basierend auf der Log-Base-10 der Zahl berechnet werden, aber das wird schnell sehr kompliziert.result = ('%15f' % val).rstrip('0').rstrip('.').lstrip(' ')
>>>12345.600000000000364 == 12345.6
True
Hier ist eine Lösung, die für mich funktioniert hat. Es ist eine Mischung aus der Lösung von PolyMesh und der Verwendung der neuen
.format()
Syntax .Ausgabe :
quelle
3.141
), da die.2f
fest codiert sind.Sie können einfach format () verwenden, um dies zu erreichen:
format(3.140, '.10g')
Dabei ist 10 die gewünschte Präzision.quelle
quelle
int(a) if a % 1 else a
?a if a % 1 else int(a)
ist richtig. Frage muss in Zeichenfolge ausgegeben werden, also habe ich gerade hinzugefügtstr
a % 1
ist wahr, weil es nicht Null ist. Ich habe es implizit und fälschlicherweise als wahrgenommena % 1 == 0
.Während die Formatierung wahrscheinlich die pythonischste ist, gibt es hier eine alternative Lösung mit dem
more_itertools.rstrip
Tool.Die Zahl wird in eine Zeichenfolge konvertiert, bei der nachfolgende Zeichen, die ein Prädikat erfüllen, entfernt werden. Die Funktionsdefinition
fmt
ist nicht erforderlich, wird hier jedoch zum Testen von Zusicherungen verwendet, die alle bestehen. Hinweis: Es funktioniert mit Zeichenfolgeneingaben und akzeptiert optionale Prädikate.Siehe auch Details zu dieser Drittanbieter-Bibliothek
more_itertools
.quelle
Wenn Sie mit 3. und 3.0 leben können, die als "3.0" angezeigt werden, ist dies ein sehr einfacher Ansatz, bei dem Nullen aus Float-Darstellungen entfernt werden:
(danke @ellimilial für den Hinweis auf die Ausnahmen)
quelle
print("%s"%3.0)
tut es.Die Verwendung des QuantiPhy-Pakets ist eine Option. Normalerweise wird QuantiPhy verwendet, wenn mit Zahlen mit Einheiten und SI-Skalierungsfaktoren gearbeitet wird, es bietet jedoch eine Vielzahl nützlicher Formatierungsoptionen für Zahlen.
In dieser Situation wird keine E-Notation verwendet:
Eine Alternative, die Sie vielleicht bevorzugen, ist die Verwendung von SI-Skalierungsfaktoren, möglicherweise mit Einheiten.
quelle
OP möchte überflüssige Nullen entfernen und die resultierende Zeichenfolge so kurz wie möglich machen.
Ich finde, dass die exponentielle Formatierung von% g die resultierende Zeichenfolge für sehr große und sehr kleine Werte verkürzt. Das Problem tritt bei Werten auf, die keine Exponentialschreibweise benötigen, wie 128,0, die weder sehr groß noch sehr klein sind.
Hier ist eine Möglichkeit, Zahlen als kurze Zeichenfolgen zu formatieren, die nur dann die Exponentialnotation% g verwenden, wenn Decimal.normalize zu lange Zeichenfolgen erstellt. Dies ist möglicherweise nicht die schnellste Lösung (da Decimal.normalize verwendet wird).
quelle
Für Float können Sie Folgendes verwenden:
Probier es aus:
Für Dezimalstellen siehe Lösung hier: https://stackoverflow.com/a/42668598/5917543
quelle
"{:.5g}".format(x)
Ich benutze dies, um Floats zu formatieren, um Nullen zu verfolgen.
quelle
Hier ist die Antwort:
Ausgabe "3.14" und "3"
trim='-'
Entfernt sowohl die nachgestellten Nullen als auch die Dezimalstelle.quelle
Verwenden Sie% g mit einer ausreichend großen Breite, z. B. '% .99g'. Es wird in Festkommanotation für jede einigermaßen große Zahl gedruckt.
EDIT: es funktioniert nicht
quelle
.99
ist Präzision, nicht Breite; Ein bisschen nützlich, aber Sie können die tatsächliche Genauigkeit nicht auf diese Weise einstellen (außer sie selbst abzuschneiden).Sie können
max()
wie folgt verwenden:print(max(int(x), x))
quelle
x
negativ ist.if x < 0: print(min(x), x)
else : print(max(x), x)
Sie können dies auf die meisten pythonischen Arten erreichen:
python3:
quelle
Umgang mit% f und Sie sollten setzen
, wobei: .2f == .00 schwimmt.
Beispiel:
print "Preis:% .2f"% Preise [Produkt]
Ausgabe:
Preis: 1,50
quelle