2011-03-15 277 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