为什么decimal.Decimal(0)**decimal.Decimal(0)不返回1,但返回一个错误?
import decimal
decimal.Decimal(0)**5 # works and returns Decimal('0') as it should
decimal.Decimal(0)**0 # doesn't not work and should return 1
decimal.Decimal(0)**decimal.Decimal(0) # same
0**0 # works and returns 1我可以使用if语句来绕过我得到的错误(decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]),但是这样做看起来很脏。
编辑:我在学校一直都知道0^0是1,但是。(注释)它不是。因此,如果我希望它是1,我想我将手动(在我的情况下,这是理想的行为),我没有意识到它的价值有争议。
发布于 2022-03-06 16:40:22
Python的decimal模块遵循IBM通用十进制算法规范,IBM通用十进制算法规范将0的幂为0,会引发无效的操作条件并生成NaN。默认情况下,Python会为无效的操作条件引发decimal.InvalidOperation异常,但如果需要,可以更改上下文设置以获取NaN:
In [1]: import decimal
In [2]: decimal.getcontext().traps[decimal.InvalidOperation] = False
In [3]: decimal.Decimal(0)**decimal.Decimal(0)
Out[3]: Decimal('NaN')至于为什么规范以这种方式定义操作,0^0=1是在离散上下文中最有意义的约定。它对实数没那么有用。IEEE 754选择1.0作为返回值,但IBM做出了不同的选择。这两种选择都是合理的。
https://stackoverflow.com/questions/71372106
复制相似问题