我正在努力了解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
我试图从这里的文档中理解圆函数的工作,它描述了6.549被转换为二进制浮点数,并被二进制近似所取代。我很困惑Decimal(6.549)中扩展值的近似值是从哪里来的。此外,我可以假设每个十进制值的四舍五入将以相同的方式工作吗?还是取决于单个二进制近似值?
当我以两种不同的方式使用Decimal函数时,它给出的值略有不同。此外,一个值的精度高于另一个值。有人能说明原因吗?
提前谢谢。
我很困惑Decimal(6.549)中扩展值的近似值是从哪里来的。
文字6.549
首先被转换为浮点数字,该数字以二进制形式存储:由于6.549不能完全以这种格式存储,因此它被四舍五入到最接近的值,实际上是
6.549000000000000376587649952835309851169586181640625
(有关更多详细信息,请参阅Rick Regan的浮点转换器)。
为了避免这种中间取整,请传递一个字符串:
>>> Decimal("6.549")
Decimal('6.549')
此外,我可以假设每个十进制值的四舍五入将以相同的方式工作吗?还是取决于单个二进制近似值?
是的,所有的数字文字都会有这个问题(除非它们可以精确地用二进制表示,例如45.0
和7
)。
当我以两种不同的方式使用Decimal函数时,它给出的值略有不同。此外,一个值的精度高于另一个值。有人能说明原因吗?
由于上述相同的问题:Decimal(45.0)/Decimal(7)
将首先将文字45.0
和7
转换为小数(这可以精确地完成),然后使用扩展的精度小数库执行除法。
另一方面,Decimal(45.0/7)
将45.0
和7
都转换为浮点数(这是精确的),但随后以浮点精度(这仅精确到大约16个有效数字)执行除法。然后将此结果转换为十进制(包括错误的额外数字)。