2015-11-13 60 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')