15

我正在写一个代表金钱的类,我遇到的一个问题是"1.50" != str(1.50). str(1.50) 等于 1.5,突然之间,POOF。45 美分消失了,现在是 1 美元和 5 美分。不是一美元和 50 美分。有什么办法可以阻止 str 这样做,还是我做错了什么?这是 Python 2 顺便说一句。

4

4 回答 4

29

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

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

但更好的方法是使用decimal modulefor 表示货币,因为如果您进行算术运算,二进制浮点数的表示问题可能会让您的结果略有偏差。该模块的文档特别提到了其中一些问题 - 货币应用程序最有趣的问题之一是:

>>> 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 类来表示金钱。

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

于 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 回答