如何解决为什么Decimal0的科学格式与float 0不同?
使用Decimal(0)
并将其格式化为.2e
格式时,会发生以下情况:
>>> f'{Decimal(0):.2E}'
'0.00E+2'
但是,如果仅使用0
或0.
,则会发生以下情况:
>>> f'{0.:.2E}'
'0.00E+00'
结果如何不同?
解决方法
在上一个答案中,我描述了如何在cpython中完成的过程,在此我将描述为什么。 discussion中提出了这个问题,大部分引号都来自此:
我们来看一个例子:
>>> x = Decimal("1e+5").quantize(Decimal("1e+10"))
>>> x
Decimal('0E+10')
>>> s = "{:.19e}".format(x)
>>> s
'0.0000000000000000000e+29'
>>> Decimal(s)
Decimal('0E+10')
原始大小为e+10
,格式化后仍为e+10
。
格式化后,原始数字的大小会保留。
从十进制的角度来看,这是正确的事情。原始的幅度应该是可追溯的
0
在IBM规范中确实很特别。大小是 保持精度是不正确的。>>> Decimal("0e10") * Decimal("0e20") Decimal('0E+30') >>> Decimal("0.000e10") Decimal('0E+7')
因此,基本上,我们在格式化时 精度。
因此,如果我们回到OP的原始示例:
>>> f'{Decimal(0):.2E}'
'0.00E+2'
如果返回0.00Е+00
,则该十进制数字的大小为E-2
:
>>> d = f'{Decimal(0):.2E}'
>>> d
'0.00E+2'
>>> Decimal(d)
Decimal('0')
>>> d = '0.00E+00'
>>> Decimal(d)
Decimal('0.00')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。