2013-11-14 71 views
2

我需要一個擁有1000個十進制數字的類來計算一系列類似pi數字的東西。花時間並不重要。我如何定義__add__ & ...這樣做的功能? 比如我需要一個值可以保存這個數字: 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113如何定義在python中保存1000位數的小數類?

:))

此號碼使用decimal.Decimal這樣表示:

from decimal import Decimal as dc 
>>> x=dc(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113) 
>>> x 
Decimal('3.141592653589793115997963468544185161590576171875') 

但我需要一個新的類持有所有DIGITS,我可以使用添加,劃分和...功能在它像2 + 1和pi數是一個例子,正是我不需要計算我想要的pi數計算超大的十進制數!

+0

它是好的,如果你能堅持這個作爲一個字符串??? –

+0

沒問題,但我需要定義一個類! –

+0

「decimal.Decimal」不適合你嗎? –

回答

5

你必須設置一個情境與1000個十進制數字:

context = decimal.Context(prec=1000) 
decimal.setcontext(context) 

從現在開始計算,將使用1000位精度。

例子:

>>> decimal.setcontext(decimal.Context(prec=1000)) 
>>> pi = decimal.Decimal('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113') 
>>> pi 
Decimal('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113') 
>>> pi + 2 
Decimal('5.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113') 

需要注意的是:

  • 您,是因爲如果使用float解釋必須先截斷它使用字符串初始化Decimal。 (我相信只有decimal的最新版本接受float的說法。在舊版本中,您必須改用Decimal.from_float)。
  • 在計算過程中保留小數位數。

您還可以通過localcontext contextmanager本地使用的語境:

context = decimal.Context(prec=1000) 

with decimal.localcontext(context): 
    # here decimal uses 1000 digits for computations 
    pass 

# here the default context is restored. 
0

我的嘗試。可能不是很好。

class pi: 
    def __init__(self): 
     self.pi_digits = ['1', '4', '1', '5', '9', '2', '6'] # pi = 3.1415926 
    def __repr__(self): 
     return '3.'+''.join(self.pi_digits) 
    def add(self, digit): 
     digit = str(digit) 
     if digit.isdigit(): 
      self.pi_digits.append(digit) 
     else: 
      raise TypeError 

my_pi = pi() 
my_pi.add(3) 
my_pi.add(5) 
print (my_pi) 

輸出

3.141592635 

PS - 這僅僅是給你的,你會如何做事情一個大概的瞭解。

0

此函數將給你基於分子(數值)和分母(deno)的值的字符串和精度,它可以用於任何小數而不僅僅是pi。對於pi,你可以使用22/7和任何你想要的精度。

def pi_accur(numer,deno,precision): 
    pi_holder=[] 
    while (precision>=1): 
     pi_holder.append(int(numer/deno)) 
     numer=10*(numer%deno) 
     precision=precision-1 

    new_val=str(pi_holder[0])+'.' 
    for i in pi_holder[1:]: 
     new_val=new_val+str(i) 
    return new_val 

>>> pi_accur(22,7,9) 
    '3.14285714' 

>>>pi_accur(22,7,15) 
    '3.14285714285714' 
+0

22/7 - pi〜= 0.001264489267349618680213759577 ... – vroomfondel

+0

@rogaos:我的觀點並不是要找出差異在實際的pi和22/7之間,我知道它們有區別,但只是爲了幫助OP找到存儲諸如22/7(接近pi)等術語值的方式。 –

+0

downvoters,請謹慎解釋原因? –

1

你做初始化與double不能代表你的大數目的Decimal對象的錯誤。

所以不是說:

x=dc(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113) 

...這正好有相同的效果:

x=dc(3.1415926535897932384626433832795) 

...從一個字符串初始化:

x=dc('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113') 

和您將獲得完全精確的預期結果。

+0

如果我使用類似x + dc(2)的程序,程序將表示這個數字:十進制('5.141592653589793238462643383') –

+0

是的,'x'是'Decimal'類型的普通對象,它具有任意的精度。您的問題是您作爲參數傳遞給其構造函數的數字的有限精度。 – Kos

+0

那我該怎麼辦?我有這個大的十進制數,我想添加一些像數字2. –