Python 十进制转字符串产生奇怪的科学记数法

Python Decimal to string produces strange scientific notation

我正在处理一个错误,将 str 函数应用于 decimal.Decimal 的实例会得到字符串 '0E-1000'。我希望 str 应用于 Decimal 总是会给我一个形式为 -?[0-9]+(\.[0-9]+) 的字符串,这正是我想要的。

首先,如果我没有理解错的话,科学记数法'0E-1000'代表0 x 10^-1000,即0。为什么我会得到这种特定的零表示形式?为什么不是'0E-42',是一样的?

其次,我无法手动构建重现此错误的 Decimal。有问题的 Decimal 实例来自外部来源。在 REPL 中,表达式 str(Decimal(0)) 的计算结果为 '0'。如何构建 Decimald 实例,其中 str(d) 的计算结果为 '0E-1000'

编辑:第三,如何将任意 Decimal 实例转换为 decimal 表示法中的字符串?

如果你想重现你的小数,只需从字符串构造它:

>>> d=decimal.Decimal("0E-1000")
>>> str(d)
'0E-1000'

我认为区别在于 00.00000 之间的区别(或者在您的情况下为 1000 个零),这就是准确性。这在科学情况下可能很重要,因为舍入等是由操作数的精度控制的。如果你想让打印一致,使用decimal.Decimal.normalize:

>>> d=decimal.Decimal("0E-1000")
>>> d
Decimal('0E-1000')
>>> d.normalize()
Decimal('0')
>>> str(d.normalize())
'0'