如何在python中定义一个包含1000位数字的decimal类?

如何在python中定义一个包含1000位数字的decimal类?,python,class,python-3.x,python-3.3,bigdecimal,Python,Class,Python 3.x,Python 3.3,Bigdecimal,我需要一个包含1000个十进制数字的类来计算一个系列中的pi数。花时间并不重要。我如何定义\uuuuuuuuuuuuuuuuuuuuu&。。。如何实现这一点? 例如,我需要一个可以容纳此数字的值: 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812

我需要一个包含1000个十进制数字的类来计算一个系列中的pi数。花时间并不重要。我如何定义
\uuuuuuuuuuuuuuuuuuuuu
&。。。如何实现这一点? 例如,我需要一个可以容纳此数字的值: 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113

(:))

此数字使用
decimal。decimal
显示如下:

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

但是我需要一个新的类来保存所有的数字,我可以使用加法,除法和。。。其中的函数,比如2+1和π数就是一个例子,我不需要计算π数,我想计算超大的十进制数

我的尝试。可能不是很好

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-这只是让您大致了解如何进行操作。

此函数将根据分子(numer)和分母(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'

你犯了一个错误,用不能代表你的大数字的
double
初始化
Decimal
对象

因此,与其说:

x=dc(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113)
…其效果与:

x=dc(3.1415926535897932384626433832795)
…从字符串初始化:

x=dc('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113')

您将以全精度获得预期结果。

您必须设置一个包含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')
请注意:

  • 必须使用字符串来初始化
    十进制
    ,因为如果使用
    浮点
    ,解释器必须首先截断它。(我还认为只有最新版本的
    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.

如果可以将其作为字符串保存,可以吗???没问题,但我需要定义一个类!是不是有什么原因导致十进制。十进制不适合您?请看我的答案,它将根据分子、分母和精度为您提供值的字符串表示,该值可用于任何小数,而不仅仅是pi。相关:如果我使用x+dc(2)之类的东西,程序将表示这个数字:十进制('5.141592653589793238462643383')是的,
x
是一个类型为
Decimal
的普通对象,它具有任意精度。您的问题是作为参数传递给它的构造函数的数字的精度有限。所以我必须做什么呢?我有一个很大的十进制数,我想添加一些类似于2的数字。就像我说的那样,将其视为任何其他数字,
x+=2
在其他十进制数消失和python显示
decimal('5.141592653589793238462643383')
@rogaos之前:我的目的不是识别实际pi和22/7之间的差异,我知道这两者之间存在差异,而是帮助OP找到存储22/7(接近pi)等术语值的方法在某种程度上,他想要。我投了反对票,因为我发现这一点非常不清楚;pi绝对不是一个小数。如果你据此编辑你的帖子,我会撤销。请注意,如果他想要1000(正确)小数位数,他可能需要一个1000位数的分子,这似乎不是一个可持续的技术。分数模块不是已经做到了吗?