为什么Python的Decimal函数默认为54个位置?

and*_*orc 6 python decimal

输入后

from decimal import *
getcontext().prec = 6
Decimal (1) / Decimal (7)
Run Code Online (Sandbox Code Playgroud)

我得到了价值

Decimal('0.142857')  
Run Code Online (Sandbox Code Playgroud)

但是,如果我进入Decimal (1.0/7)我得到

Decimal('0.142857142857142849212692681248881854116916656494140625')
Run Code Online (Sandbox Code Playgroud)

Ray*_*ger 11

1.0/7计算二进制浮点数到17位精度.这发生之前十进制构造看到它:

>>> d = 1.0 / 7
>>> type(d)
<type 'float'>
>>> d.as_integer_ratio()
(2573485501354569, 18014398509481984)
Run Code Online (Sandbox Code Playgroud)

二进制分数2573485501354569/18014398509481984与二进制浮点一样接近,可以使用53位精度.它不完全是1/7,但它非常接近.

然后,Decimal构造函数将二进制分数转换为必要的位数,以获得精确的十进制等效值.您正在查看的结果是您在准确评估2573485501354569/18014398509481984时获得的结果:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 100
>>> Decimal(2573485501354569) / Decimal(18014398509481984)
Decimal('0.142857142857142849212692681248881854116916656494140625')
Run Code Online (Sandbox Code Playgroud)

学习要点1: 二进制浮点计算二进制分数为53位精度.如有必要,结果将四舍五入.

学习点2:十进制构造二进制浮点数字转换为无损小数(四舍五入没有).这往往会产生比您预期更多的精度数字(参见Decimal常见问题解答中的第6个问题).

学习要点3:十进制模块旨在将所有数字视为精确数字.只有计算结果四舍五入到上下文精度.二进制浮点输入将精确转换为十进制,并且在使用数字进行计算之前不会应用上下文精度(有关详细信息,请参阅十进制常见问题解答中的最后一个问题和答案).

执行摘要: 在将数字传递给十进制模块之前,不要进行二进制浮点除法.让它按照您所需的精度完成工作.

希望这可以帮助 :-)