2015-11-13 64 views
0

我正在研究Project Euler #26并需要计算小数部分。python计算小数部分为任意长度

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

使用下面我可以一个小数部分的第17位:

from __future__ import division 
1/7 

# 0.14285714285714285 

相反,我想编写一个函数,不会停止,直到我从它返回,并且这个功能只是不断生成小数部分。

+3

你的意思是这样:'打印 “%.50f” %(1.0/7)' – ZdaR

+0

好极了!谢谢!完全有效。 – SeanPlusPlus

回答

3

您可以生成的使用你在学校学到的方法相同数字的无限数量:长除法。只需从每个部门中取出剩余部分并将其移位一位数字(乘以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

对于Decimal这个特殊问题,这是一个更好的方法。留下我的回答,以防其他人在此登陆时有用,但这应该是公认的答案。 –

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')