Wie drucke ich einen Prozentwert in Python?


182

Das ist mein Code:

print str(float(1/3))+'%'

und es zeigt:

0.0%

aber ich will bekommen 33%

Was kann ich tun?


11
int / int = int, int / float = float, flaot / int = float
AbiusX

3
Prozent bedeutet pro hundert . Wenn Sie ein einfaches Verhältnis haben ( 1/3in Ihrem Fall), haben Sie einen Wert pro Einheit , der multipliziert werden muss 100, um einen Prozentwert zu erhalten. In den anderen Antworten finden Sie den Unterschied zwischen Ganzzahl- und Gleitkommadivision.
Apalala

FWIW wird in Python 3.x print(str(float(1/3))+'%')gedruckt 0.3333333333333333%- immer noch nicht genau das, was Sie wollen, aber zumindest ist es ein bisschen näher. Dies liegt daran, dass die Teilung in dieser Version anders funktioniert.
Martineau

Antworten:


277

formatunterstützt einen prozentualen Gleitkomma-Genauigkeitstyp :

>>> print "{0:.0%}".format(1./3)
33%

Wenn Sie keine Ganzzahldivision wünschen, können Sie die Python3-Division importieren aus __future__:

>>> from __future__ import division
>>> 1 / 3
0.3333333333333333

# The above 33% example would could now be written without the explicit
# float conversion:
>>> print "{0:.0f}%".format(1/3 * 100)
33%

# Or even shorter using the format mini language:
>>> print "{:.0%}".format(1/3)
33%

4
Ist das float(1)wirklich pythonischer als 1.?
Tobias Kienzler

@TobiasKienzler, ich weiß nicht, ob es pythonischer ist. Zumindest ist es etwas, über das Sie beim Lesen des Codes stolpern. Ich denke, mit Python 3 und realer Teilung ist diese Irritation standardmäßig verschwunden.
Miku

Tatsächlich. Ich frage mich, warum Guido von Anfang an keine echte Teilung implementiert hat ... Das Runden von 1/3 auf 0 sollte doch explizit sein ...
Tobias Kienzler

1
@TobiasKienzler Wahrscheinlich, weil Python früher näher an C war als heute.
glglgl

14
In Python 2 würde ich 1.0anstelle von float(1)oder verwenden 1.. IMHO ist es weniger aufdringlich als das erstere und nicht so subtil wie das letztere.
MestreLion

175

Es gibt eine bequemere Option zur Formatierung in Prozent für die .format()Formatierungsmethode:

>>> '{:.1%}'.format(1/3.0)
'33.3%'

4
Gibt es eine Möglichkeit, dies mit der "%.1f"Formatierung der alten Schule zu tun ?
Yuji 'Tomita' Tomita

1
Ein bisschen "weniger bequem", aber ja! Wie oben vorgeschlagenprint("%.1f%%" % (100 * 1.0/3))

12
Dies ist die beste Antwort, da keine Multiplikation mit 100 erforderlich ist. Vielmehr wird die Tatsache ausgenutzt, dass formatbereits Prozentsätze gedruckt werden können!
Blambert

5
Dies sollte die akzeptierte Antwort sein. Dies ist viel mehr Pythonic, da integrierte Funktionen verwendet werden, um die bedeutungslosen Implementierungsdetails zu eliminieren, die eine Multiplikation mit 100 bedeuten würde.
Ksadowski

1
so im F-String-Stil wird es seinf"{1/3.0:.1%}"
Kubas

66

Nur der Vollständigkeit halber, da mir aufgefallen ist, dass niemand diesen einfachen Ansatz vorgeschlagen hat:

>>> print("%.0f%%" % (100 * 1.0/3))
33%

Einzelheiten:

  • %.0fsteht für " einen Gleitkomma mit 0 Dezimalstellen%.2f drucken ", würde also drucken33.33
  • %%druckt ein Literal %. Ein bisschen sauberer als dein Original+'%'
  • 1.0anstatt 1sich darum zu kümmern, die Division zum Schweben zu zwingen, also nicht mehr0.0

1
Anmerkung: 100,0 * 1/3 -> ok, 100,0 * (1/3) -> 0,0 nicht ok
mpgn

@martialdidit: Ich bin mir dessen bewusst , dass, deshalb meine Antwort ist nicht Klammer haben in 1/3. Bewertungsauftrag ist beabsichtigt:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion

Auf jeden Fall habe ich den Zwang von der 100auf die verschoben 1, um die Dinge klar zu machen.
MestreLion

2
Verzeihung, @RuggeroTurra? Dies ist eine Formatierung im weiteren Sinne, die eine Eingabe in eine Zeichenfolge umwandelt . Bitte beachten Sie die OP nie die Verwendung erforderlich .format(), und %-Formatieren, auch bekannt als String - Interpolation in Python, ist eine absolut gültige Alternative.
MestreLion

Mit% formatieren Sie einen Float in eine Zeichenfolge. Kein Float zu einer Prozentzeichenfolge. Die Multiplikation mit 100 erfolgt von Hand, nicht mit%. Ich denke, die einzig richtige Lösung, die nur Formatierung verwendet, ist mit {: .0%}
Ruggero Turra

38

Sie teilen ganze Zahlen und konvertieren sie dann in float. Teilen Sie stattdessen durch Schwimmer.

Verwenden Sie als Bonus die hier beschriebenen fantastischen Formatierungsmethoden für Zeichenfolgen: http://docs.python.org/library/string.html#format-specification-mini-language

Festlegen einer prozentualen Konvertierung und Genauigkeit.

>>> float(1) / float(3)
[Out] 0.33333333333333331

>>> 1.0/3.0
[Out] 0.33333333333333331

>>> '{0:.0%}'.format(1.0/3.0) # use string formatting to specify precision
[Out] '33%'

>>> '{percent:.2%}'.format(percent=1.0/3.0)
[Out] '33.33%'

Ein tolles Juwel!


18

Nur um Python 3 F-String-Lösung hinzuzufügen

prob = 1.0/3.0
print(f"{prob:.0%}")

4

Dann möchten Sie dies stattdessen tun:

print str(int(1.0/3.0*100))+'%'

Das .0bezeichnet sie als Floats und int()rundet sie anschließend wieder auf ganze Zahlen.


Ich weiß, das ist aus dem Jahr 2011, aber ... int()rundet nicht. zB int(1.9) != 2. Rundung kann so gemacht werden -round(1.9,0) == 2
besitzt

int()sicherlich nicht rund hinunter die Zahl. Mein Beispiel macht genau das, was ich damit gemeint habe. die Ziffern abschneiden, da dies das OP wollte.
Morten Kristensen

Stockoverflow ist großartig - ein paar Jahre und immer noch eine Antwort. Danke dir. Der Vollständigkeit halber möchte ich jedoch klarstellen. int()löscht die Ziffern. Es rundet nicht ab. Rundung bedeutet, dass etwas mit den Ziffern zu tun hat. Das Endergebnis ist jedoch dasselbe; In diesem Sinne verstehe ich Ihren Standpunkt. Außerdem klärt das OP nicht, was er / sie mit den Ziffern machen möchte, hat 33.333 ... rundet auf 33. Vielen Dank, dass Sie auf meinen Kommentar geantwortet haben und einen schönen Tag haben!
besitzt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.