为什么 Python 的十进制函数默认为 54 位?



输入后

from decimal import *
getcontext().prec = 6
Decimal (1) / Decimal (7)

我得到的值

Decimal('0.142857')  

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

Decimal('0.142857142857142849212692681248881854116916656494140625')

1.0/7计算一个精度为17位的二进制浮点数。这种情况发生在Decimal构造函数看到它之前:

>>> d = 1.0 / 7
>>> type(d)
<type 'float'>
>>> d.as_integer_ratio()
(2573485501354569, 18014398509481984)

二进制分数2573485501354569/180114398509481984与使用53位精度的二进制浮点值非常接近。虽然不完全是七分之一,但已经很接近了。

Decimal构造函数然后将二进制分数转换为所需的位数,以获得精确的十进制等价值。你看到的结果是当你准确地评估2573485501354569/18014388509481984时得到的结果:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 100
>>> Decimal(2573485501354569) / Decimal(18014398509481984)
Decimal('0.142857142857142849212692681248881854116916656494140625')

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

学习点2:小数构造函数将二进制浮点数无损地转换为小数(无舍入)。这往往会导致比您预期的精度高得多的数字(请参阅十进制常见问题解答中的第6个问题)。

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

执行摘要:在将数字交给十进制模块之前,不要进行二进制浮点除法。让它按照你想要的精度工作。

希望这有帮助:-)

最新更新