为什么 decimal.Decimal 不支持与 float 数据类型进行算术运算?

3
我正在处理一些需要保持高精度计算结果的脚本,因此我开始使用 decimal.Decimal 而非内置的浮点数。我知道它无法与浮点数类型值一起使用,并且会返回 TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'。我需要确切地知道为什么它不支持与浮点数进行这种类型的操作。
示例:
from decimal import Decimal

expr_= 1.2+Decimal('1')

当我尝试将字符串添加到浮点数时出现此类型的错误,这对我来说似乎是合乎逻辑的,但在尝试计算两个数字值时却不会出现该错误。

使用SymPy Float数据类型进行相同的操作时,我可以轻松地完成而不会遇到任何问题。例如:

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

1
可能是因为不清楚结果是浮点数还是十进制数,以及它的精度是多少。 - Ry-
我编辑了问题的细节,并提供了一个示例,其中Python处理了类似的情况,而没有返回任何问题。 - Ahmed Hawary
我猜这是一种预防措施。如果你需要超高精度,不小心添加一个普通的浮点数可能会像给一个小数点后10位准确的数字加上“嗯,不知道,大约一百万左右”的值。如果你真的想要这个,你可以在相加之前将float转换为Decimal - tobias_k
虽然有些数字可以准确地表示为“浮点数”,但无法确定您的数字是其中之一,还是只是被舍入为其中之一。 - tobias_k
SymPy不是Python的一部分,因此可以自由选择其加法运算符(Decimal('1.6')+Float(1.2)将推迟执行)。 - Ry-
1个回答

4

PEP 327 -- 十进制数据类型 解释道:

Aahz强烈反对与浮点数进行交互,建议进行显式转换:问题在于Decimal能够比float具有更高的精度、准确性和范围。有效的Python表达式示例35 + 1.1似乎暗示着Decimal(35) + 1.1也应该是有效的。然而,仔细一看,它只展示了整数到浮点数转换的可行性。因此,十进制浮点数的正确类比是35 + Decimal(1.1)。两种强制转换,从整数到浮点数和从整数到Decimal,都可以在不产生表示错误的情况下完成。如何在二进制和十进制浮点数之间进行强制转换的问题更加复杂。我提出允许与浮点数进行交互,进行精确的转换,并在超过当前上下文的精度时引发ValueError(这可能太棘手了,因为例如在精度为9的情况下,Decimal(35) + 1.2是可以的,但Decimal(35) + 1.1会引发错误)。结果证明这太棘手了。太棘手了,以至于c.l.p同意在这种情况下引发TypeError:您不能混合使用Decimal和float。
这是关于编程的Python开发者邮件列表讨论。要查看完整线程,请参见2003-10档案并搜索“Decimal”。
所以,最终{{link3:“明确胜于含蓄”}}的哲学获胜了。

谢谢!这非常有帮助。 - Ahmed Hawary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接