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