Bagaimana cara mencetak nilai persentase dalam python?

183

ini kode saya:

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

dan itu menunjukkan:

0.0%

tapi aku ingin mendapatkannya 33%

Apa yang dapat saya?

zjm1126
sumber
11
int / int = int, int / float = float, flaot / int = float
AbiusX
3
Persen berarti per seratus . Jika Anda memiliki rasio sederhana ( 1/3dalam kasus Anda), Anda memiliki nilai per unit yang harus dikalikan dengan 100untuk mendapatkan nilai persen . Lihat jawaban lain untuk perbedaan antara pembagian integer dan float.
Apalala
FWIW, dalam Python 3.x print(str(float(1/3))+'%')akan mencetak 0.3333333333333333%- masih tidak persis apa yang Anda inginkan, tetapi setidaknya itu sedikit lebih dekat. Ini karena pembagian bekerja secara berbeda dalam versi itu.
martineau

Jawaban:

279

formatmendukung jenis presisi persentase floating point :

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

Jika Anda tidak ingin divisi integer, Anda dapat mengimpor divisi Python3 dari __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
sumber
4
Benarkah float(1)lebih pythonic daripada 1.?
Tobias Kienzler
@TobiasKienzler, saya tidak tahu, apakah itu lebih pythonic. Setidaknya itu adalah sesuatu yang Anda tersandung saat membaca kode. Saya pikir dengan Python 3 dan pembagian nyata secara default gangguan ini hilang.
miku
Memang. Saya bertanya-tanya mengapa Guido tidak menerapkan pembagian nyata dari awal ... Pembulatan 1/3 ke 0 harus jelas setelah semua ...
Tobias Kienzler
1
@TobiasKienzler Mungkin karena di masa lalu, Python lebih dekat ke C daripada saat ini.
glglgl
14
Dalam Python 2, saya akan menggunakan 1.0alih-alih float(1)atau 1.. IMHO itu kurang menonjol dari yang pertama dan tidak sehalus yang terakhir.
MestreLion
175

Ada opsi pemformatan 'persen' yang lebih nyaman untuk .format()metode format:

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

sumber
4
Apakah ada cara untuk melakukan ini dengan "%.1f"format sekolah lama ?
Yuji 'Tomita' Tomita
1
Sedikit "kurang nyaman", tapi, ya! Seperti yang disarankan di atasprint("%.1f%%" % (100 * 1.0/3))
12
Ini adalah jawaban terbaik karena tidak memerlukan perkalian dengan 100. Alih-alih mengambil keuntungan dari fakta yang formatsudah tahu cara mencetak persentase!
blambert
5
Ini harus menjadi jawaban yang diterima. Ini jauh lebih Pythonic, menggunakan kemampuan bawaan untuk menghilangkan detail implementasi yang tidak berarti seperti perkalian 100.
ksadowski
2
jadi dengan gaya f-stringf"{1/3.0:.1%}"
Kubas
66

Hanya demi kelengkapan, karena saya perhatikan tidak ada yang menyarankan pendekatan sederhana ini:

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

Detail:

  • %.0fkependekan dari " print float dengan 0 desimal ", begitu %.2fjuga dengan print33.33
  • %%mencetak literal %. Sedikit lebih bersih dari aslinya+'%'
  • 1.0bukannya 1mengurus memaksa divisi untuk mengapung, jadi tidak ada lagi0.0
MestreLion
sumber
1
catatan: 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 not ok
mpgn
@martialdidit: Saya sadar akan hal itu, itulah mengapa jawaban saya tidak memiliki tanda kurung 1/3. Urutan evaluasi disengaja:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion
Bagaimanapun, saya telah memindahkan paksaan dari 100ke 1, untuk memperjelas.
MestreLion
2
Maaf, @RuggeroTurra? Ini adalah format, dalam arti luas bahwa itu mengubah input untuk ditampilkan sebagai string. Harap perhatikan bahwa OP tidak pernah mengharuskan penggunaan .format(), dan %-formating, juga dikenal sebagai interpolasi string dengan Python, adalah alternatif yang benar-benar valid.
MestreLion
Dengan% Anda memformat float ke string. Bukan float ke string persentase. Perkalian dengan 100 dilakukan dengan tangan, bukan oleh%. Saya pikir satu-satunya solusi yang benar yang hanya menggunakan pemformatan adalah dengan {: .0%}
Ruggero Turra
38

Anda membagi bilangan bulat lalu mengonversi menjadi float. Membagi dengan mengapung sebagai gantinya.

Sebagai bonus, gunakan metode pemformatan string yang luar biasa yang dijelaskan di sini: http://docs.python.org/library/string.html#format-specification-mini-language

Untuk menentukan konversi persen dan presisi.

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

Permata yang luar biasa!

Yuji 'Tomita' Tomita
sumber
18

Hanya untuk menambahkan solusi f-string Python 3

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

Maka Anda ingin melakukan ini sebagai gantinya:

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

Yang .0menunjukkan mereka sebagai mengapung dan int()membulatkannya ke bilangan bulat setelah itu lagi.

Morten Kristensen
sumber
Saya tahu ini dari 2011 tapi ... int()tidak bulat. mis int(1.9) != 2. Pembulatan dapat dilakukan seperti -round(1.9,0) == 2
memiliki
int()tentu tidak putaran bawah nomor. Teladan saya melakukan persis apa yang saya maksud; memotong angka karena itulah yang diinginkan OP.
Morten Kristensen
Stockoverflow hebat - beberapa tahun dan masih respons. Terima kasih. Namun, demi kelengkapan, saya ingin mengklarifikasi. int()menjatuhkan digit. Itu tidak bulat. Pembulatan menyiratkan itu melakukan sesuatu dengan digit. Hasil akhirnya sama saja; dalam pengertian itu, saya mengerti maksud Anda. Juga, OP tidak mengklarifikasi apa yang dia ingin lakukan dengan angka-angka yang ada 33.333 ... tidak menjadi 33. Terima kasih telah menanggapi komentar saya dan bersenang-senang!
Memiliki