如何将小数格式化为始终显示两位小数?

381 投票
13 回答
803827 浏览
提问于 2025-04-15 17:35

我想显示:

4949.00

还有:

54.954.90

无论小数的长度是多少,或者是否有小数位,我都想把 Decimal 显示为两位小数,并且希望这样做的方式要高效。这样做的目的是为了显示货币的数值。

比如说,4898489.00


关于内置的 float 类型的类似问题,可以查看 限制浮点数为两位小数

13 个回答

160

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

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

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

文档有时候可能会比较难懂,所以我推荐一些更容易阅读的参考资料:

Python 3.6引入了字面字符串插值(也叫f-strings),这样你可以更简洁地写出上面的内容:

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

我猜你可能在使用Decimal()对象,这个是来自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

接下来的问题是:

问:一旦我有了有效的两位小数输入,如何在整个应用中保持这个不变?

如果你需要这个问题的答案(还有很多其他有用的信息),可以查看文档中提到的部分。另外,如果你保持你的Decimal对象在小数点后有两位精度(也就是说,尽量保持小数点左边的所有数字和右边的两位数字,没有更多……),那么用str将它们转换成字符串是没问题的:

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

撰写回答