Jak wydrukować wartość procentową w pythonie?

183

to jest mój kod:

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

i to pokazuje:

0.0%

ale chcę dostać 33%

Co mogę zrobić?

zjm1126
źródło
11
int / int = int, int / float = float, flaot / int = float
AbiusX
3
Procent oznacza sto . Jeśli masz prosty stosunek ( 1/3w twoim przypadku), masz wartość na jednostkę, która musi ją pomnożyć, 100aby uzyskać wartość procentową . Zobacz inne odpowiedzi na temat różnicy między dzieleniem całkowitym a zmiennoprzecinkowym.
Apalala
FWIW, w Pythonie 3.x print(str(float(1/3))+'%')wydrukuje 0.3333333333333333%- wciąż nie dokładnie to, czego chcesz, ale przynajmniej jest trochę bliżej. Jest tak, ponieważ podział działa w tej wersji inaczej.
martineau,

Odpowiedzi:

279

formatobsługuje procentowy typ precyzji zmiennoprzecinkowej :

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

Jeśli nie chcesz podziału na liczby całkowite, możesz zaimportować podział na Python3 z __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%
miku
źródło
4
Czy float(1)naprawdę jest bardziej pytoniczny niż 1.?
Tobias Kienzler
@TobiasKienzler, nie wiem, czy jest bardziej pythonowy. Przynajmniej jest to coś, na co można natknąć się podczas czytania kodu. Myślę, że w Pythonie 3 i prawdziwym podziale domyślnie to podrażnienie zniknęło.
miku
W rzeczy samej. Zastanawiam się, dlaczego Guido od samego początku nie wprowadził prawdziwego podziału ... Zaokrąglanie 1/3 do 0 powinno być jednak wyraźne ...
Tobias Kienzler
1
@TobiasKienzler Prawdopodobnie dlatego, że we wcześniejszych czasach Python był bliższy C niż obecnie.
glglgl 17.07.13
14
W Pythonie 2 użyłbym 1.0zamiast float(1)lub 1.. IMHO jest mniej natarczywy niż pierwszy i nie tak subtelny jak drugi.
MestreLion
175

Istnieje znacznie wygodniejsza opcja formatowania procentowego dla .format()metody formatowania:

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

źródło
4
Czy można to zrobić za pomocą "%.1f"formatowania oldschoolowego?
Yuji „Tomita” Tomita
1
Trochę „mniej wygodne”, ale tak! Jak sugerowano powyżejprint("%.1f%%" % (100 * 1.0/3))
12
To najlepsza odpowiedź, ponieważ nie wymaga pomnożenia przez 100. Raczej korzysta z faktu, że formatjuż wie, jak drukować procenty!
blambert,
5
To powinna być zaakceptowana odpowiedź. Jest to o wiele bardziej Pythonic, wykorzystujące wbudowane funkcje, aby wyeliminować bezsensowne szczegóły implementacji, którymi byłoby pomnożenie przez 100.
ksadowski
2
tak będzie w stylu f-stringf"{1/3.0:.1%}"
Kubas
66

Ze względu na kompletność, ponieważ zauważyłem, że nikt nie zasugerował tego prostego podejścia:

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

Detale:

  • %.0foznacza „ wydrukuj liczbę zmiennoprzecinkową z 0 miejscami po przecinku ”, więc %.2fwydrukuje33.33
  • %%drukuje literał %. Trochę czystszy niż twój oryginał+'%'
  • 1.0zamiast 1zajmować się zmuszaniem dywizji do wypłynięcia, więc nie więcej0.0
MestreLion
źródło
1
uwaga: 100,0 * 1/3 -> ok, 100,0 * (1/3) -> 0,0 nie w porządku
mpgn
@martialdidit: Mam tego świadomość, dlatego moja odpowiedź nie zawiera nawiasów 1/3. Kolejność oceny jest celowa:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion
W każdym razie przesunąłem przymus z 100do 1, aby wszystko było jasne.
MestreLion
2
Czy chcesz wybaczyć @RuggeroTurra? Jest to formatowanie, w szerokim znaczeniu tego słowa, które przekształca dane wejściowe do wyświetlania w postaci łańcucha. Należy pamiętać, że OP nigdy nie wymagało użycia .format()i %formatowania, znanego również jako interpolacja łańcuchów w Pythonie, jest całkowicie poprawną alternatywą.
MestreLion
Za pomocą% formatujesz zmiennoprzecinkowe na łańcuch. Nie zmiennoprzecinkowe do ciągu procentowego. Mnożenie przez 100 odbywa się ręcznie, a nie przez%. Myślę, że jedynym poprawnym rozwiązaniem, które korzysta tylko z formatowania, jest {: .0%}
Ruggero Turra
38

Dzielisz liczby całkowite, a następnie konwertujesz na liczbę zmiennoprzecinkową. Zamiast tego podziel przez pace.

Jako bonus użyj niesamowitych metod formatowania napisów opisanych tutaj: http://docs.python.org/library/string.html#format-specification-mini-language

Aby określić procent konwersji i precyzję.

>>> 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%'

Świetny klejnot!

Yuji „Tomita” Tomita
źródło
18

Wystarczy dodać rozwiązanie f-string Python 3

prob = 1.0/3.0
print(f"{prob:.0%}")
menrfa
źródło
4

Zamiast tego chcesz to zrobić:

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

.0Oznacza je jako pływaków i int()rund je do liczb całkowitych potem znowu.

Morten Kristensen
źródło
wiem, że pochodzi z 2011 roku, ale ... int()nie zaokrągla. np int(1.9) != 2. Zaokrąglanie można wykonać w ten sposób -round(1.9,0) == 2
jest właścicielem
int()z pewnością zaokrągla liczbę w dół . Mój przykład robi dokładnie to, co miałem na myśli; odcinanie cyfr, ponieważ tego właśnie chciał PO.
Morten Kristensen
Przepływ zapasów jest świetny - kilka lat i wciąż odpowiedź. Dziękuję Ci. Jednak ze względu na kompletność chcę wyjaśnić. int()upuszcza cyfry. Nie zaokrągla w dół. Zaokrąglanie oznacza, że ​​robi coś z cyframi. Wynik końcowy jest taki sam; w tym sensie rozumiem twój punkt widzenia. Ponadto OP nie wyjaśnia, co chce zrobić z cyframi, ma 33 333 ... zaokrągla do 33. Dziękuję za odpowiedź na mój komentarz i życzę miłego dnia!
jest właścicielem