2011-03-15 538 views
84

這是我的代碼:如何顯示百分比在python

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

,它顯示:

0.0% 

,但我希望得到33%

我能做些什麼。

+9

int/int = int,int/float = float,flaot/int = float – AbiusX 2011-03-15 02:18:27

+3

_Percent_表示_per hundred_。如果你有一個簡單的比例(在你的情況下是'1/3'),你必須有一個_per_的值,它必須乘以'100'來得到一個_percent_的值。看到整數和浮點數的區別的其他答案。 – Apalala 2011-03-16 14:08:34

回答

129

format是一個內置因爲Python 2.6:

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

如果你不想整數除法,則可以從__future__導入Python3的分工:

>>> 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% 
+3

'float(1)'比'1'更真pythonic嗎? – 2013-07-17 07:58:49

+0

@TobiasKienzler,我不知道,如果它更pythonic。至少這是你在閱讀代碼時偶然發現的東西。我認爲用Python 3和* real * division默認情況下,這種刺激消失了。 – miku 2013-07-17 08:19:09

+0

確實。我想知道爲什麼Guido從一開始就沒有實現真正的分割......將1/3舍入到0應該是[explicit](http://www.python.org/dev/peps/pep-0020/「Explicit is 「)畢竟...... – 2013-07-17 08:53:30

-3

怎麼是這樣的:

print str(round(float(1.0/3.0) * 100) )[:2] + '%' 

這[2]位將切下的結果.0。

+0

已更新,以移除列表理解並調用round() – JeremyFromEarth 2011-03-15 02:22:29

+0

回滾您的編輯 - round()比int()更合適 - 例如,考慮2.0/3.0。和列表理解,列表理解是什麼? – GreenMatt 2011-03-15 02:31:31

+0

也許我使用了錯誤的術語,但是我認爲[:2]被認爲是列表理解,不是嗎? – JeremyFromEarth 2011-03-15 02:34:57

32

您將整數然後轉換爲浮動。取而代之的是花車。

作爲獎勵,使用這裏描述的真棒字符串格式化方法:http://docs.python.org/library/string.html#format-specification-mini-language

要指定轉化率和精確度。

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

一顆偉大的寶石!

3

然後,你想這樣做,而不是:

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

.0表示他們的花車和int()之後他們再次輪爲整數。

+0

我知道這是來自2011年,但是...... int()不輪。例如'int(1.9)!= 2'。舍入可以像這樣完成 - 'round(1.9,0)== 2' – owns 2016-04-26 18:12:16

+0

'int()'肯定會舍入數字。我的例子正是我所要做的;切斷數字,因爲這是OP想要的。 – 2016-04-27 07:33:11

+0

Stockoverflow是偉大的 - 幾年,仍然是一個迴應。謝謝。但是,爲了完整起見,我想澄清一下。 'int()'丟棄數字。它並沒有縮小。舍入意味着它對數字進行了一些操作。儘管最終的結果是一樣的;從這個意義上說,我明白你的觀點。此外,OP沒有說明他/她想要做什麼33.333 ...的數字是33回合。感謝您回覆我的評論,祝您有美好的一天! – owns 2016-04-30 15:43:46

32

只是爲了完整起見,因爲我發現沒有人提出這種簡單的方法:

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

詳情:

  • %.0f代表「打印與0位小數一個浮動」 ,所以%.2f將打印33.33
  • %%打印文字%。有一點比你原來的+'%'
  • 1.0而不是1照顧強迫師的浮動清潔,所以沒有更多的0.0
+0

備註:100.0 * 1/3 - > ok,100.0 *(1/3) - > 0.0不好 – mpgn 2015-02-13 23:05:54

+0

@martialdidit:我意識到這一點,這就是爲什麼我的答案在* 1/3沒有括號'。評估順序是故意的:'100.0 * 1/3 => 100.0/3 => 0.33 ...' – MestreLion 2015-02-14 16:08:16

+0

無論如何,我已經將強制從'100'移到了'1',以便說清楚。 – MestreLion 2015-02-14 16:13:55

97

有一種方法更方便「percent'格式化爲.format()格式方法的選擇:

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

有沒有辦法做到這一點與舊學校''%.1f「'格式? – 2015-03-17 23:28:25

+1

有點「不太方便」,但是,是的!像上面建議的那樣'print(「%。1f %%」%(100 * 1.0/3))' – Sebastian 2015-03-17 23:32:46

+3

呵呵,所以沒有。沒有實際的%格式類型。 – 2015-03-18 18:00:26

-1

只要把這樣的:

print '%.2f%%' % 24.689 # Double percentage sign