[英]Keep trailing zeroes in python
我正在编写一个类来表示金钱,我遇到的一个问题是"1.50" != str(1.50)
。 str(1.50) 等于 1.5,突然间,POOF。 45 美分已经消失,现在是 1 美元和 5 美分。 不是一美元和 50 美分。 有什么办法可以阻止 str 这样做,还是我做错了什么? 这是 Python 2 顺便说一句。
您可以对字符串使用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')
使用货币时,始终使用 Decimal 类表示货币。
x = 1.500000
print '%.2f' % x
print '{:.3f}'.format(x)
结果
1.50
1.500
当事先不知道数字的大小时,所提出的解决方案不起作用,这在科学应用中很常见,而不是在与金钱相关的应用中。 我为那些像我一样来到这个问题寻找科学案例的人提供了一个替代解决方案。
例如,如果我想将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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.