在python中保持尾随零

时间:2013-03-06 02:55:54

标签: python parsing

我正在写一个代表金钱的课程,我遇到的一个问题是"1.50" != str(1.50)。 str(1.50)等于1.5,并且突然,POOF。 45美分已经消失,金额现在是1美元和5美分。不是一美元和50美分。我可以用任何方式阻止str这样做,或者我做错了什么?这是Python 2 BTW。

4 个答案:

答案 0 :(得分:22)

您可以对字符串使用format方法来指定要表示的小数位数:

>>> "{:.2f}".format(1.5)
'1.50'

但更好的方法是使用decimal module代表金钱,因为如果你在做算术,二元浮点数的表示问题会给你略微偏离的结果。该模块的文档特别提到了其中一些问题 - 金钱应用程序中最有趣的一个是:

>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> from decimal import Decimal
>>> Decimal('.1') + Decimal('.1') + Decimal('.1') - Decimal('.3')
Decimal('0.0')

答案 1 :(得分:8)

使用Money时,总是使用Decimal类代表金钱。

http://docs.python.org/2/library/decimal.html

答案 2 :(得分:1)

x = 1.500000

print '%.2f' % x
print '{:.3f}'.format(x)

结果

1.50
1.500

答案 3 :(得分:0)

当数字的大小事先未知时,建议的解决方案不起作用,这在科学应用程序中而不是在与金钱有关的应用程序中很常见。我为像我这样的人提供了一个替代解决方案,以寻找科学案例。

例如,如果我要打印x = 1.500e-4到三位有效数字(处理给定不确定性的测量时很常见),以下命令显然不能给出正确的结果:

x = 1.500e-4
print(f"{x:.3f}")

----> 0.000

这里,我使用现代的Python 3.6+ f-strings进行格式化。

人们可能会考虑使用g格式说明符,但是由于省略了结尾的零,这也不能给期望的3位有效数字带来结果:

x = 1.500e-4
print(f"{x:.3g}")

----> 0.00015

可以使用g格式说明符以及格式说明mini language的一个相当晦涩的选项(哈希字符#)以下列方式获得正确答案:

x = 1.500e-4
print(f"{x:#.3g}")

----> 0.000150

在原始问题的简单情况下,这种格式也不会更改:

x = 1.500
print(f"{x:#.3g}")

----> 1.50