我在 Django 应用程序中使用 Decimal 对象,发现了这个奇怪的错误:
请注意,这个错误不仅限于ipdb:我发现这是因为Decimal(380) % 1破坏了我的django应用程序。
描述此错误的文档如下所述:
除法不可能 如果整数除法或余数运算的整数结果具有太多位数(将比精度更长),则会发生并发出无效操作信号。结果为[0,qNaN]。
有什么想法吗?
ipdb> decimal.Decimal(10) % 1
Decimal('0')
ipdb> decimal.Decimal(100) % 1
*** decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
ipdb> decimal.Decimal(150) % 1
*** decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
ipdb> decimal.Decimal(79) % 1
Decimal('0')
ipdb> decimal.Decimal(100.1) % 2
Decimal('0.10')
ipdb> decimal.Decimal(1000) % 2
*** decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
更加神秘的是,直到数字变得非常大,这种情况在ipython中才会发生:
In [23]: decimal.Decimal(10**27) % 1
Out[23]: Decimal('0')
In [24]: decimal.Decimal(10**28) % 1
---------------------------------------------------------------------------
InvalidOperation Traceback (most recent call last)
<ipython-input-24-6ceaef82d283> in <module>()
----> 1 decimal.Decimal(10**28) % 1
InvalidOperation: [<class 'decimal.DivisionImpossible'>]
请注意,这个错误不仅限于ipdb:我发现这是因为Decimal(380) % 1破坏了我的django应用程序。
描述此错误的文档如下所述:
除法不可能 如果整数除法或余数运算的整数结果具有太多位数(将比精度更长),则会发生并发出无效操作信号。结果为[0,qNaN]。
有什么想法吗?
Decimal(10**28) % 1
抛出了一个decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
。 - Adam Smithdecimal.getcontext()
。 - Stefan Pochmanntry: decimalobj % 1 except decimal.InvalidOperation: int(decimalobj) % 1
,因为这只会出现在整数上面。 - Adam Smith