簡體   English   中英

python計算小數部分到任意長度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM