[英]python calculate decimal fraction part to arbitrary length
我正在研究Euler#26項目 ,需要計算小數部分。
使用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'
使用浮點格式的注釋在所有情況下均無法正常工作,因為浮點數不能表示任意精確的小數點(例如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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.