如何在python中打印百分比值?


182

这是我的代码:

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

它显示:

0.0%

但我想得到 33%

我能做什么?


11
int / int = int,int / float = float,flaot / int = float
AbiusX 2011年

3
百分比是指每百。如果您有一个简单的比率(1/3以您的情况为例),则您有一个单位值,必须将其乘以100一个百分比值。有关整数和浮点除法之间的区别,请参见其他答案。
2011年

FWIW,将在Python 3.x中print(str(float(1/3))+'%')打印0.3333333333333333%-仍不是您想要的,但至少距离您更近了。这是因为除法在该版本中的工作方式有所不同。
martineau

Answers:


278

format支持百分比浮点精度类型

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

如果您不希望整数除法,则可以从导入Python3的除法__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)真的比更Python 1.
Tobias Kienzler

@TobiasKienzler,我不知道它是否更pythonic。至少是您在阅读代码时偶然发现的。我认为默认情况下使用Python 3和真正的划分,这种烦恼消失了。
miku

确实。我不知道为什么Guido从一开始就没有实施真正的除法... 毕竟应该将1/3舍入到0
才是

1
@TobiasKienzler大概是因为在早期,Python比现在更接近C。
glglgl

14
在Python 2中,我将使用1.0代替float(1)or 1.。恕我直言,它不如前者那么引人注目,也不如后者那么微妙。
MestreLion

175

格式化方法有一种更方便的“百分比”格式化选项.format()

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

4
有没有办法用老式"%.1f"格式设置呢?
Yuji'Tomita'Tomita

1
有点“不太方便”,但是,是的!就像上面建议的一样print("%.1f%%" % (100 * 1.0/3))

12
这是最佳答案,因为它不需要乘以100。而是利用了format已经知道如何打印百分比的事实!
blambert '16

5
这应该是公认的答案。这是更多的Python语言,使用内置功能消除了100乘以会产生的无意义的实现细节。
ksadowski

1
因此,以f弦样式f"{1/3.0:.1%}"
为准

66

只是为了完整起见,因为我注意到没有人建议这种简单的方法:

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

细节:

  • %.0f代表“ 打印带有0个小数位的浮点数 ”,因此%.2f将打印33.33
  • %%打印文字%。比原来的要干净一点+'%'
  • 1.0而不是1强迫分部浮动,所以不再0.0

1
注意:100.0 * 1/
3-

@martialdidit:我知道,这就是为什么我的答案中没有括号的原因1/3。评估顺序是有意的:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion

在任何情况下,我搬到从胁迫1001,以把事情说清楚。
MestreLion

2
请原谅,@ RuggeroTurra?此格式化,在广泛的意义上,它变换一个输入显示为字符串。请注意,OP从来不需要使用.format(),并且%-formatting(在Python中也称为字符串插值)是一种完全有效的选择。
MestreLion

使用%,您正在将浮点数格式化为字符串。不是浮点数到百分比字符串。乘以100是手动完成的,而不是%。我认为,仅使用格式的唯一正确解决方案是使用{:.0%}
Ruggero Turra,

38

您将整数相除,然后转换为浮点数。除以浮点数代替。

另外,请使用此处描述的很棒的字符串格式化方法: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%'

一个伟大的宝石!


18

只是添加Python 3 f字符串解决方案

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

4

然后,您想这样做:

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

.0表示他们的花车和int()事后再发他们的整数。


我知道这是从2011年开始的,但是int()。例如int(1.9) != 2。可以这样进行舍入round(1.9,0) == 2
拥有

int()肯定不会回合下来的数量。我的示例完全符合我的意图。切断数字,因为这就是OP想要的。
Morten Kristensen

存货过剩很棒-几年了,仍然是一个回应。谢谢。但是,出于完整性考虑,我想澄清一下。int()删除数字。它不会四舍五入。四舍五入意味着它对数字做了一些处理。最终结果是一样的。从这个意义上说,我明白你的意思。另外,OP并没有阐明他/她想如何处理数字为33.333 ...确实为33的整数。感谢您对我的评论的回复,并祝您愉快!
拥有
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.