我正在研究Project Euler #26並需要計算小數部分。python計算小數部分爲任意長度
使用Python,如何將1除以7並告訴函數只是給我小數部分,直到我從函數返回?
使用下面我可以一個小數部分的第17位:
from __future__ import division
1/7
# 0.14285714285714285
相反,我想編寫一個函數,不會停止,直到我從它返回,並且這個功能只是不斷生成小數部分。
我正在研究Project Euler #26並需要計算小數部分。python計算小數部分爲任意長度
使用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'
對於Decimal這個特殊問題,這是一個更好的方法。留下我的回答,以防其他人在此登陸時有用,但這應該是公認的答案。 –
使用浮點格式不會在所有情況下正常工作,因爲花車不能代表任意精確小數註釋(如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')
你的意思是這樣:'打印 「%.50f」 %(1.0/7)' – ZdaR
好極了!謝謝!完全有效。 – SeanPlusPlus