python将小数部分计算为任意长度



我正在处理Project Euler#26,需要计算小数部分。

使用Python,如何将1除以7,并告诉函数继续给我小数部分,直到我从函数返回?

使用下面的我可以得到小数部分的前17位数字:

from __future__ import division
1/7
# 0.14285714285714285

相反,我想写一个在返回之前不会停止的函数,这个函数只是继续生成小数部分。

您可以使用在学校学到的相同方法生成无限多个数字:长除法。只需从每次除法中取余数,并将其移位一位(乘以10),然后除法得到一个新的余数。

def infinite_divide(numerator, denominator):
    if numerator > denominator:
        raise ValueError('This function only returns digits after the decimal')
    while numerator != 0:
        numerator *= 10
        digit, numerator = divmod(numerator, denominator)
        yield digit

下面是一个使用中的示例。我使用islice将结果限制在50位,否则它会很乐意一直生成数字,直到内存耗尽。

>>> from itertools import islice
>>> '0.' + ''.join(str(digit) for digit in islice(infinite_divide(1, 7), 50))
'0.14285714285714285714285714285714285714285714285714'

使用浮点格式的注释不会在所有情况下都正确工作,因为浮点不能表示任意精确的小数(例如,1/7应该是一个重复的小数,但过一段时间就会分解):

In [1]: print "%.50f"%(1.0/7)
0.14285714285714284921269268124888185411691665649414

相反,您可以使用Python内置的十进制来获得任意精度:

In [2]: from decimal import Decimal, getcontext
In [3]: Decimal(1)/Decimal(7)
Out[3]: Decimal('0.1428571428571428571428571429')
In [4]: getcontext().prec = 100
In [5]: Decimal(1)/Decimal(7)
Out[5]: Decimal('0.1428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571429')

最新更新