如何将小数格式化为始终显示两位小数?
我想显示:
49
为 49.00
还有:
54.9
为 54.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 字符串格式食谱:展示了新风格的
.format()
字符串格式化的例子 - pyformat.info:对比了旧风格的
%
字符串格式化和新风格的.format()
字符串格式化
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'