我正在研究Project Euler #26,需要计算小数部分。
使用Python,如何将1除以7并告诉函数只是继续给我小数部分,直到我从函数返回?
使用下面我可以得到小数部分的前17位数字:
from __future__ import division
1/7
# 0.14285714285714285
相反,我想写一个函数,直到我从它返回时才停止,这个函数只是继续生成小数部分。
答案 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')