我正在写一个代表金钱的类,我遇到的一个问题是"1.50" != str(1.50)
. str(1.50) 等于 1.5,突然之间,POOF。45 美分消失了,现在是 1 美元和 5 美分。不是一美元和 50 美分。有什么办法可以阻止 str 这样做,还是我做错了什么?这是 Python 2 顺便说一句。
问问题
30287 次
4 回答
29
您可以format
在字符串上使用该方法来指定要表示的小数位数:
>>> "{:.2f}".format(1.5)
'1.50'
但更好的方法是使用decimal module
for 表示货币,因为如果您进行算术运算,二进制浮点数的表示问题可能会让您的结果略有偏差。该模块的文档特别提到了其中一些问题 - 货币应用程序最有趣的问题之一是:
>>> 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')
于 2013-03-06T03:01:05.047 回答
12
使用金钱时,始终使用 Decimal 类来表示金钱。
于 2013-03-06T03:00:49.320 回答
4
当事先不知道数字的大小时,建议的解决方案不起作用,这在科学应用中很常见,而不是在与金钱相关的应用中。我为那些像我一样来寻找科学案例的人提供了一个替代解决方案。
例如,如果我想打印x = 1.500e-4
到三个有效数字(处理具有给定不确定性的测量时的常见情况),以下命令显然不会给出正确的结果:
x = 1.500e-4
print(f"{x:.3f}")
----> 0.000
在这里,我使用现代 Python 3.6+ f-strings进行格式化。
有人可能会考虑使用g
格式说明符,但这也不会给三位有效数字提供所需的结果,因为省略了尾随零:
x = 1.500e-4
print(f"{x:.3g}")
----> 0.00015
可以使用格式说明符以及格式说明迷你语言g
的一个相当模糊的选项哈希字符来获得正确答案,方法如下:#
x = 1.500e-4
print(f"{x:#.3g}")
----> 0.000150
这种格式在原始问题的简单情况下也可以保持不变:
x = 1.500
print(f"{x:#.3g}")
----> 1.50
于 2020-02-17T17:51:25.573 回答
2
x = 1.500000
print '%.2f' % x
print '{:.3f}'.format(x)
结果
1.50
1.500
于 2013-03-06T03:05:25.750 回答