如何在python中定义一个包含1000位数字的decimal类?
我需要一个包含1000个十进制数字的类来计算一个系列中的pi数。花时间并不重要。我如何定义如何在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
\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位数的分子,这似乎不是一个可持续的技术。分数模块不是已经做到了吗?