python计算小数部分到任意长度

时间:2015-11-13 17:06:51

标签: python math

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

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

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

from __future__ import division
1/7

# 0.14285714285714285

相反,我想写一个函数,直到我从它返回时才停止,这个函数只是继续生成小数部分。

2 个答案:

答案 0 :(得分:3)

您可以使用在学校学到的相同方法生成无限数字的数字:long division。只需从每个分区中取出余数并将其移位一位(乘以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 :(得分:1)

使用浮动格式的注释在所有情况下都无法正常工作,因为浮点数不能表示任意精确的小数(例如,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')