当应用于零时,是否有方法控制Python十进制量化方法?

2024-10-04 05:33:28 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑下面的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会有这样的行为


Tags: 函数infromforreturnosmacrange
1条回答
网友
1楼 · 发布于 2024-10-04 05:33:28

在回答我自己的问题时,抛开为什么Python3Decimal会有这种行为不谈,控制格式的方法是根本不要弄乱quantize。使用format更简单、更一致,如下:(使用与小数相同的zeroone定义)

>>> for q in range(10):
...   '{:.{n}f}'.format(zero, n=q)
... 
'0'
'0.0'
'0.00'
'0.000'
'0.0000'
'0.00000'
'0.000000'
'0.0000000'
'0.00000000'
'0.000000000'
>>> for q in range(10):
...   '{:.{n}f}'.format(one, n=q)
... 
'1'
'1.0'
'1.00'
'1.000'
'1.0000'
'1.00000'
'1.000000'
'1.0000000'
'1.00000000'
'1.000000000'

感谢评论中有用的提示

相关问题 更多 >