我正在研究一些处理计算的脚本,需要保持高精度的结果,所以我开始使用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)
答案 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"哲学赢了。