Python'da yüzde değeri nasıl yazdırılır?


184

bu benim kodum:

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

ve gösteriyor:

0.0%

ama almak istiyorum 33%

Ne yapabilirim?


11
int / int = int, int / float = şamandıra, flaot / int = şamandıra
AbiusX 15:11

3
Yüzde yüz anlamına gelir . Basit bir oranınız varsa ( 1/3sizin durumunuzda), yüzde değeri elde etmek için çarpmak zorunda olan birim başına100 bir değeriniz vardır. Tamsayı ve şamandıra bölümü arasındaki fark için diğer yanıtlara bakın.
Apalala

FWIW, Python 3.x'te print(str(float(1/3))+'%')yazdırılacak 0.3333333333333333%- yine de tam olarak ne istediğinizi değil, ama en azından biraz daha yakın. Bunun nedeni, bölümün bu sürümde farklı şekilde çalışmasıdır.
martineau

Yanıtlar:


280

formatyüzde kayan nokta hassasiyeti türünü destekler :

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

Tamsayı bölümü istemiyorsanız, Python3'ün bölümünü aşağıdakilerden alabilirsiniz __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
float(1)daha çok daha pythonic 1.?
Tobias Kienzler

@TobiasKienzler, daha pitonik olup olmadığını bilmiyorum. En azından kodu okurken karşılaştığınız bir şey. Bence Python 3 ve gerçek bölünme varsayılan olarak bu tahriş gitti.
miku

Aslında. Guido olmalıdır 1/3 0 yuvarlama ... baştan itibaren asıl bölünme uygulamak niye acaba açık ... sonuçta
Tobias Kienzler

1
@TobiasKienzler Muhtemelen daha önceki zamanlarda, Python C'ye günümüzden daha yakındı.
glglgl

14
Python 2'de veya 1.0yerine kullanacağım . IMHO öncekinden daha az rahatsız edici ve ikincisi kadar ince değil. float(1)1.
MestreLion

176

.format()Biçim yöntemi için daha uygun bir 'yüzde' biçimlendirme seçeneği vardır :

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

4
Bunu eski okul "%.1f"biçimlendirmesi ile yapmanın bir yolu var mı ?
Yuji 'Tomita' Tomita

1
Biraz "daha az uygun", ama evet! Yukarıda önerildiği gibiprint("%.1f%%" % (100 * 1.0/3))

12
Bu en iyi cevaptır, çünkü 100 ile çarpmayı gerektirmez. Aksine, formatyüzdelerin nasıl yazdırılacağını zaten bildiği gerçeğinden yararlanır !
blambert

5
Bu kabul edilen cevap olmalı. Bu, 100 ile çarpmanın anlamsız uygulama detayını ortadan kaldırmak için yerleşik yetenekleri kullanan çok daha Pythonic'tir.
ksadowski

2
bu yüzden f-string tarzında olacakf"{1/3.0:.1%}"
Kubas

66

Sadece eksiksizlik uğruna, kimsenin bu basit yaklaşımı önermediğini fark ettiğim için:

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

Detaylar:

  • %.0f"anlamına gelir 0 ondalık basamakla bir float yazdırmak , bu yüzden" %.2fbasacaktır33.33
  • %%hazır bilgi yazdırır %. Orijinalinden biraz daha temiz+'%'
  • 1.0Bunun yerine 1bölünmeyi yüzmeye zorlamakla ilgilenir, böylece artık0.0

1
not: 100.0 * 1/3 -> tamam, 100.0 * (1/3) -> 0.0 tamam değil
mpgn

@martialdidit: Ben en neden cevabım olmadığını, bunun farkındayım değil de parantez olan 1/3. Değerlendirme talimatı kasti:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion

Her durumda, ben gelen zorlama taşıdığınız 100için 1işler temizlemek yapmak.
MestreLion

2
Affedersiniz, @RuggeroTurra? Bu edilir o geniş anlamda, biçimlendirme dönüştüren bir dize olarak gösterilecek bir giriş. Lütfen OP'nin Python'da dize enterpolasyonu olarak da bilinen .format()ve %biçimlendirmenin hiçbir zaman gerekli olmadığını, geçerli bir alternatif olduğunu lütfen unutmayın .
MestreLion

% İle bir kayan dizeyi biçimlendirirsiniz. Yüzde dizesine kayan bir sayı değildir. 100 ile çarpma% ile değil elle yapılır. Ben sadece biçimlendirme kullanan tek doğru çözüm {: .0%} ile
Ruggero Turra

38

Tamsayıları bölüyorsunuz ve kayan noktaya dönüştürüyorsunuz. Bunun yerine şamandıralara bölün.

Bonus olarak, burada açıklanan harika dize biçimlendirme yöntemlerini kullanın: http://docs.python.org/library/string.html#format-specification-mini-language

Yüzde dönüşüm ve hassasiyet belirtmek için.

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

Harika bir mücevher!


18

Sadece Python 3 f-string çözümü eklemek için

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

4

Sonra bunun yerine bunu yapmak istersiniz:

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

.0Şamandıralar ve bunları belirtir int()sonradan tekrar tamsayılar için mermi onları.


Bu 2011'den biliyorum ama ... int()yuvarlak değil. örn int(1.9) != 2. Şöyle yapılabilir yuvarlama -round(1.9,0) == 2
sahibi

int()kesinlikle yuvarlak yapar aşağı sayı. Örneğim tam olarak ne demek istediğimi yapıyor; OP'yi istediği için rakamları kesmek.
Morten Kristensen

Stockoverflow harika - birkaç yıl ve hala bir yanıt. Teşekkür ederim. Ancak, bütünlük uğruna, açıklığa kavuşturmak istiyorum. int()basamakları düşürür. Yuvarlanmıyor. Yuvarlama, rakamlarla bir şey yaptığını ima eder. Sonuç yine de aynıdır; bu anlamda, fikrinizi görüyorum. Ayrıca, OP basamaklarıyla ne yapmak istediğini netleştirmez 33.333 ... 33'e yuvarlar. Yorumuma yanıt verdiğiniz için teşekkür eder ve iyi günler dileriz!
sahibi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.