如何格式化小数以始终显示2位小数?

时间:2010-01-03 17:30:44

标签: python string-formatting

我想要显示:

4949.00

54.954.90

无论小数的长度或是否有小数位,我都希望显示一个带有2位小数的Decimal,我想以有效的方式完成。目的是显示货币价值。

例如,4898489.00

13 个答案:

答案 0 :(得分:433)

您应该使用new format specifications来定义您的值的表示方式:

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

文档有时可能有点迟钝,因此我建议使用以下更易读的引用:

Python 3.6引入了literal string interpolation(也称为f-strings)所以现在你可以将上面的内容写得更简洁:

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

答案 1 :(得分:132)

Python文档的String Formatting Operations部分包含您正在寻找的答案。简而言之:

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

答案 2 :(得分:95)

我想你可能正在使用Decimal()模块中的decimal个对象? (如果您需要精确到两位数以上的小数点以及任意大数字的精度,那么你肯定应该这样,这就是你的问题的标题所暗示的......)

如果是这样,文档的Decimal FAQ部分会有一个问题/答案对,可能对您有用:

  

Q值。在具有两个小数位的定点应用程序中,某些输入具有许多位置并需要舍入。其他人不应该有多余的数字,需要进行验证。应该使用哪些方法?

     

一个。 quantize()方法舍入到固定数量的小数位。如果设置了Inexact陷阱,它对验证也很有用:

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

下一个问题是

  

Q值。一旦我有有效的两位输入,我如何在整个应用程序中保持该不变量?

如果您需要答案(以及许多其他有用信息),请参阅the aforementioned section of the docs。此外,如果你保持Decimal s的精度超过小数点两位数(意味着保持小数点左边所有数字和左边两个数字所需的精度,并且不再有...),然后将它们转换为str的字符串将正常工作:

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

答案 3 :(得分:29)

您可以使用string formatting operator

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

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

答案 4 :(得分:22)

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

您可以将2中的2f更改为您想要显示的任意小数点数。

编辑:

Python3.6开始,转换为:

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

答案 5 :(得分:19)

.format是一种更易读的处理变量格式的方法:

'{:.{prec}f}'.format(26.034, prec=2)

答案 6 :(得分:6)

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

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

答案 7 :(得分:6)

在python 3中,一种实现方法是

'{0:.2f}'.format(number)

答案 8 :(得分: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

答案 9 :(得分:2)

OP 总是想要两位小数显示,所以像所有其他答案一样显式调用格式化函数还不够好。

正如其他人已经指出的那样,Decimal 适用于货币。但是 Decimal 显示所有小数位。因此,覆盖其显示格式化程序:

class D(decimal.Decimal):
    def __str__(self):
        return f'{self:.2f}'  

用法:

>>> cash = D(300000.991)
>>> print(cash)
300000.99

简单。

答案 10 :(得分:1)

这与您可能已经看到的解决方案相同,但是通过这种方式可以更清楚:

>>> num = 3.141592654

>>> print(f"Number: {num:.2f}")

答案 11 :(得分:0)

最简单的方法示例:

代码:

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

输出:正确答案:88.64%

答案 12 :(得分:-5)

怎么样

print round(20.2564567 , 2)    >>>>>>>        20.25


print round(20.2564567 , 4)    >>>>>>>        20.2564