为什么decimal.Decimal不支持float-data类型的算术运算?

时间:2018-02-19 11:02:46

标签: python

我正在研究一些处理计算的脚本,需要保持高精度的结果,所以我开始使用decimal.Decimal而不是内置的float。

我知道它不适用于float类型的值,它返回TypeError:不支持的操作数类型+:' decimal.Decimal'并且'漂浮' 我需要确切知道的是为什么它不能用float来支持这种类型的操作。

示例:

from decimal import Decimal

expr_= 1.2+Decimal('1')

当我尝试将str添加到float以获取此类错误但在尝试计算两个数值时没有时,这对我来说似乎是逻辑。

虽然我可以轻松地使用SymPy Float数据类型做同样的事情,而不会遇到任何问题。例如:

from decimal import Decimal
from sympy import Float
expr_=Decimal('1.6')+Float(1.2)

1 个答案:

答案 0 :(得分:1)

PEP 327 -- Decimal Data Type解释说:

  

Aahz强烈反对与浮动互动,暗示明确转换:

     
    

问题在于Decimal能够提供比浮动更高的精度,准确度和范围。

  
     

有效的python表达式35 + 1.1的示例似乎表明了这一点     Decimal(35) + 1.1也应该有效。然而,仔细观察就会发现它     只演示了整数到浮点的可行性     转换。因此,十进制浮点的正确模拟是35 +     小数(1.1)。强制,int-to-float和int-to-Decimal都可以完成     没有发生表示错误。

     

如何在二进制和十进制浮点之间强制转换的问题是     更复杂。我建议允许与float的交互,准确     如果超过当前精度,则转换并引发ValueError     上下文(这可能太棘手了,因为例如精度为9,     十进制(35)+ 1.2可以,但十进制(35)+ 1.1会引发错误。

     

这太棘手了。非常棘手,c.l.p同意在这种情况下引发TypeError:你不能混合Decimal和float。

这是关于这个主题的python开发人员mailing list discussion。有关完整主题,请参阅2003-10 archive并搜索“十进制”。

所以最后,"Explicit is better than implicit"哲学赢了。