如何设置小数位格式以始终显示2个小数位?


237

我要显示:

4949.00

和:

54.954.90

不管小数长度或是否有小数位,我都希望显示一个Decimal带有2个小数位的a,并且我想以一种有效的方式来做到这一点。目的是显示货币值。

例如, 4898489.00


4
您需要它尽可能长吗?那是什么意思?您可以添加前导零,直到用完内存,但是我怀疑那不是您想要的...
Mark Byers 2010年

我想这可能意味着OP使用的是decimal.Decimal,并且对十进制上下文的精度不满意,因为它将精度限制为n位,例如“严格意义上为n位精度”(例如'123.456'变为Decimal('1.2E + 2')),而不是“小数部分的n位数字”(对于Decimal('123.45'))...请参阅我的回答,以寻求对此的帮助。;-)
米哈尔Marczyk

1
是的,它们是为了钱的价值。
orokusaki 2010年

Answers:


105

我想您可能正在使用模块中的Decimal()对象decimal?(如果您需要精确到小数点后两位精确到两位数且任意大的数字,那么绝对应该如此,这就是您的问题标题所暗示的……)

如果是这样,文档的“ 十进制常见问题解答”部分将包含一个问题/答案对,这可能对您有用:

问:在具有两位小数位的定点应用程序中,某些输入有很多位,需要四舍五入。其他人不应有多余的数字,需要进行验证。应该使用什么方法?

答:Quantize()方法将舍入到固定数量的小数位数。如果设置了不精确陷阱,则它对于验证也很有用:

>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None

下一个问题是

问:一旦有了有效的两个位置输入,如何在整个应用程序中保持不变?

如果您需要答案(以及许多其他有用的信息),请参阅docs的上述部分。另外,如果您将Decimals的精度保持在小数点后两位(这意味着要使所有数字保持在小数点的左边,而使所有数字保持在小数点的右边,并且不多...),然后将它们转换为str可以正常工作:

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'

2
哦,忘了在答案中提到效率了……但是我想我仍然不是专家。我看不出为什么保持固定数量的“小数位数”特别低效-尽管对数字执行的任何运算可能都需要对结果进行舍入运算以使其符合要求。为了提高效率,应该尽可能少地执行此操作-就像在为用户进行序列化/打印之前一样。
米哈尔Marczyk

516

您应该使用新的格式规范来定义应如何表示值:

>>> from math import pi  # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'

该文档有时可能有点晦涩难懂,所以我建议您使用以下更容易阅读的参考文献:

Python 3.6引入了文字字符串插值(也称为f字符串),因此现在您可以将上面的内容写得更简洁:

>>> f'{pi:.2f}'
'3.14'

4
@Droogans:EUH ...... format没有返回str,而不是一个floatprint type({0:.2f}".format(pi))退货<type 'str'>
BioGeek 2012年

哎呀。动词重载这个词return。请在头脑上将其更改为prints。
Droogans,2012年

20
如果您不想使用数字占位符:"{:.2f}".format(pi)
用户

怎么0:办?我假设它.是python字符串的一部分
information_interchange

135

Python文档的“ 字符串格式操作”部分包含您要寻找的答案。简而言之:

"%0.2f" % (num,)

一些例子:

>>> "%0.2f" % 10
'10.00'
>>> "%0.2f" % 1000
'1000.00'
>>> "%0.2f" % 10.1
'10.10'
>>> "%0.2f" % 10.120
'10.12'
>>> "%0.2f" % 10.126
'10.13'

不需要使用0after %,也不需要包装numtuple
user238424 2010年

17
实际上,将num包裹在一个元组中是一种编码约定,可以防止在格式化字符串时在参数上出现鸭子输入错误。在这种情况下,使用float转换不会产生任何效果,但可以防止在转换为字符串时发生意外的类型错误。考虑r = 1; "%s" % r; r = (1, 2); "%s" % rr = 1; "%s" % (r,); r = (1,2 ); "%s" % (r,)。因此,Python中最复杂的编码样式现在使用无条件元组(并且Python 3不推荐使用整个字符串格式化方法,因为它易于出错)。
特拉维斯·布拉德肖

另外,作为具有数学背景的人,“裸”十进制表示法很丑陋。前导0并没有什么坏处,而且看起来更好。:)
特拉维斯·布拉德肖

3
从美学上讲没什么不同。最重要的是,无论如何,0是默认值。如果提供了美观的代码,则提供默认值绝对没有害处。有趣的是,有多少开发人员选择不(不能?)区分正确性和样式。:/
特拉维斯·布拉德肖

32

您可以这样使用字符串格式运算符

num = 49
x = "%.2f" % num  # x is now the string "49.00"

我不确定“高效”是什么意思-几乎可以肯定这不是应用程序的瓶颈。如果您的程序运行缓慢,请先对其进行分析,以找到热点,然后对其进行优化。


1
我认为名为“ f”的变量可能会使某些人感到困惑。最好为下面的示例Travis称呼它。
Aleck Landgraf

28
>>> print "{:.2f}".format(1.123456)
1.12

您可以更改22f任意数量的要显示小数点。

编辑:

Python3.6,这意味着:

>>> print(f"{1.1234:.2f}")
1.12



6

如果您有多个参数,则可以使用

 print('some string {0:.2f} & {1:.2f}'.format(1.1234,2.345))
 >>> some string 1.12 & 2.35

3

如果您将其用作货币,并且还希望将值与分隔,则,可以使用

$ {:,.f2}.format(currency_value)

例如:

currency_value = 1234.50

$ {:,.f2}.format(currency_value) --> $ 1,234.50

这是我前一段时间写的一些代码:

print("> At the end of year " + year_string + " total paid is \t$ {:,.2f}".format(total_paid))

> At the end of year   1  total paid is         $ 43,806.36
> At the end of year   2  total paid is         $ 87,612.72
> At the end of year   3  total paid is         $ 131,419.08
> At the end of year   4  total paid is         $ 175,225.44
> At the end of year   5  total paid is         $ 219,031.80   <-- Note .80 and not .8
> At the end of year   6  total paid is         $ 262,838.16
> At the end of year   7  total paid is         $ 306,644.52
> At the end of year   8  total paid is         $ 350,450.88
> At the end of year   9  total paid is         $ 394,257.24
> At the end of year  10  total paid is         $ 438,063.60   <-- Note .60 and not .6
> At the end of year  11  total paid is         $ 481,869.96
> At the end of year  12  total paid is         $ 525,676.32
> At the end of year  13  total paid is         $ 569,482.68
> At the end of year  14  total paid is         $ 613,289.04
> At the end of year  15  total paid is         $ 657,095.40   <-- Note .40 and not .4  
> At the end of year  16  total paid is         $ 700,901.76
> At the end of year  17  total paid is         $ 744,708.12
> At the end of year  18  total paid is         $ 788,514.48
> At the end of year  19  total paid is         $ 832,320.84
> At the end of year  20  total paid is         $ 876,127.20   <-- Note .20 and not .2

0

向您展示如何做到这一点的最简单方法示例是:

代码:

>>> points = 19.5 >>> total = 22 >>>'Correct answers: {:.2%}'.format(points/total) `

输出:正确答案:88.64%


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.