我怎么能格式一个小数总是显示2位小数点后?

我想要显示:

49作为49.00

和:

54.9作为54.90

不管小数点的长度或是否有任何小数点,我想显示一个Decimal小数点后2位,并且我想以一种有效的方式来做。目的是展示货币价值。

例如,4898489.00


有关内置float类型的类似问题,请参见将浮点数限制为两个小数点

660391 次浏览

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'

你可以这样使用字符串格式化操作符:

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

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

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

如果是这样,文档的< em >十进制FAQ < / em >部分有一个可能对你有用的问题/答案对:

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

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

下一个问题是

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

如果你需要答案(以及许多其他有用的信息),请参阅前面提到的文档部分。同样,如果你让你的__abc0在小数点后保持两位精度(意思是保持所有数字都在小数点左边,两个在小数点右边,没有更多的精度),那么用str将它们转换为字符串将很好:

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

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

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

文档有时可能有点迟钝,所以我推荐以下更容易阅读的参考:

Python 3.6引入了字面值字符串插值(也称为f-strings),所以现在你可以把上面的代码写得更简洁:

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

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

编辑:

Python3.6中,它转换为:

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

.format是一种可读性更好的处理变量格式化的方式:

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

是什么

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




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

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

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

在python 3中,这样做的一种方法是

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

最简单的例子是:

代码:

< p > <代码>祝辞祝辞祝辞积分= 19.5 , <代码>祝辞祝辞的在总数= 22 >>>'Correct answers: {:.2%}'.format(points/total) ' < / p >

输出:正确答案:88.64%

如果你用它来表示货币,并且还想用,来分隔值,你可以使用

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

例如:

currency_value = 1234.50

__abc0 __abc1 __abc2

下面是我不久前写的一段代码:

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

这与你可能已经看到的解决方案是一样的,但是这样做会更清楚:

>>> num = 3.141592654

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

OP 总是需要两个小数点后的位置显示,所以像所有其他答案所做的那样显式调用格式化函数是不够的。

正如其他人已经指出的,Decimal适用于货币。但是Decimal显示了所有的小数点后数位。因此,重写它的显示格式化器:

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

用法:

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

简单。

编辑:

显示至少两位小数,但没有截断有效数字:

class D(decimal.Decimal):
def __str__(self):
"""Display at least two decimal places."""
result = str(self)
i = result.find('.')
if i == -1:
# No '.' in self. Pad with '.00'.
result += '.00'
elif len(result[i:]) == 2:
# One digit after the decimal place. Pad with a '0'.
result += '0'
return result

我希望Python的未来版本将改进数字格式,以允许最小的小数位数。类似于Excel数字格式中的#符号。