Python中的十进制算术不一致(舍入错误)

时间:2018-03-22 11:23:53

标签: python floating-point decimal

>>> from decimal import Decimal
>>> Decimal('0.3637') * (Decimal('1') / Decimal('0.9323')) == Decimal('0.3637') / Decimal('0.9323')
False

为什么?

我认为十进制模块解决了浮点运算中的舍入问题。 如何在Python中检查两个十进制数的相等性?

1 个答案:

答案 0 :(得分:0)

<强>观察

操作顺序对于理解为什么您看到结果至关重要:

from decimal import Decimal as D

D('0.3637') * (D('1') / D('0.9323')) == D('0.3637') / D('0.9323')
# False

(D('0.3637') * D('1')) / D('0.9323') == D('0.3637') / D('0.9323')
# True

<强>解释

原因是given here,摘录如下。十进制算术仍然是基本上有限的精度。

可以,如果对你很重要,应该使用getcontext().prec降低精确度。有关详细信息,请参阅decimal documentation

  

一般来说,十进制可能会过火而且仍然会有   在极少数情况下舍入错误时数字没有限制   十进制表示(例如分母的任何分数   不是1或可被2或5整除 - 小数基数的因子   (10))。

<强>解决方案

对于花车的一般比较:

<强> What is the best way to compare floats for almost-equality in Python?

相关问题