Decimal和Round函数工作中的混淆



我正在努力了解Python的四舍五入和十进制函数的实际工作原理。为此,我尝试运行以下代码:

from decimal import Decimal print("An integer %i and a float %.1f" %(23, 6.549)) print Decimal(6.549) print Decimal(45.0)/Decimal(7) print Decimal(45.0/7)

我得到了输出:

An integer 23 and a float 6.5
6.54900000000000037658764995285309851169586181640625
6.428571428571428571428571429
6.4285714285714288251938342000357806682586669921875
  1. 我试图从这里的文档中理解圆函数的工作,它描述了6.549被转换为二进制浮点数,并被二进制近似所取代。我很困惑Decimal(6.549)中扩展值的近似值是从哪里来的。此外,我可以假设每个十进制值的四舍五入将以相同的方式工作吗?还是取决于单个二进制近似值?

  2. 当我以两种不同的方式使用Decimal函数时,它给出的值略有不同。此外,一个值的精度高于另一个值。有人能说明原因吗?

提前谢谢。

我很困惑Decimal(6.549)中扩展值的近似值是从哪里来的。

文字6.549首先被转换为浮点数字,该数字以二进制形式存储:由于6.549不能完全以这种格式存储,因此它被四舍五入到最接近的值,实际上是

6.549000000000000376587649952835309851169586181640625

(有关更多详细信息,请参阅Rick Regan的浮点转换器)。

为了避免这种中间取整,请传递一个字符串:

>>> Decimal("6.549")
Decimal('6.549')

此外,我可以假设每个十进制值的四舍五入将以相同的方式工作吗?还是取决于单个二进制近似值?

是的,所有的数字文字都会有这个问题(除非它们可以精确地用二进制表示,例如45.07)。

当我以两种不同的方式使用Decimal函数时,它给出的值略有不同。此外,一个值的精度高于另一个值。有人能说明原因吗?

由于上述相同的问题:Decimal(45.0)/Decimal(7)将首先将文字45.07转换为小数(这可以精确地完成),然后使用扩展的精度小数库执行除法。

另一方面,Decimal(45.0/7)45.07都转换为浮点数(这是精确的),但随后以浮点精度(这仅精确到大约16个有效数字)执行除法。然后将此结果转换为十进制(包括错误的额外数字)。

最新更新