考虑下面的Python 3片段:(Mac OS Casalina上的Python 3.7.7)
>>> from decimal import Decimal as d
>>> zero = d('0')
>>> one = d('1')
>>> for q in range(10):
... one.quantize(d('10') ** -q)
...
Decimal('1')
Decimal('1.0')
Decimal('1.00')
Decimal('1.000')
Decimal('1.0000')
Decimal('1.00000')
Decimal('1.000000')
Decimal('1.0000000')
Decimal('1.00000000')
Decimal('1.000000000')
>>> for q in range(10):
... zero.quantize(d('10') ** -q)
...
Decimal('0')
Decimal('0.0')
Decimal('0.00')
Decimal('0.000')
Decimal('0.0000')
Decimal('0.00000')
Decimal('0.000000')
Decimal('0E-7')
Decimal('0E-8')
Decimal('0E-9')
为什么零量子化在这一点上变成了E符号?为什么它与其他数字不一致?我怎样才能控制它
注意:如果我使用内置的round
函数而不是quantize
,我会得到完全相同的不一致性,这导致我猜测round
在获得十进制数时调用quantize
因为我想要带尾随零的字符串,所以我能想到的最佳解决方法是编写我自己的_round()
函数:
def _round(s, n):
if decimal.Decimal(s).is_zero():
return '0.' + '0' * n
return decimal.Decimal(s).quantize(decimal.Decimal(10) ** -n)
但这似乎有点站不住脚。无论如何,我想了解为什么Decimal.quantize
会有这样的行为
在回答我自己的问题时,抛开为什么Python3
Decimal
会有这种行为不谈,控制格式的方法是根本不要弄乱quantize
。使用format
更简单、更一致,如下:(使用与小数相同的zero
和one
定义)感谢评论中有用的提示
相关问题 更多 >
编程相关推荐