我需要一个类持有1000个十进制数字来计算的东西如pi数量的一个系列。 以时间并不重要。 我如何定义__add__
&...功能做到这一点? 比如我需要一个值可以保存这个数字:3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113
:))
使用这个号码decimal.Decimal
这样表示:
from decimal import Decimal as dc
>>> x=dc(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113)
>>> x
Decimal('3.141592653589793115997963468544185161590576171875')
但我需要一个新的类持有的所有数字,我可以使用添加,划分和...功能像2 + 1和PI数字是这样一个例子,准确地我也不需要计算我想计算圆周率数字超大的十进制数!
你必须设置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
接受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.
你做的初始化的错误Decimal
与对象double
不能代表你的大数目。
因此,而不是说:
x=dc(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113)
......它具有完全相同的效果:
x=dc(3.1415926535897932384626433832795)
......从一个字符串初始化:
x=dc('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113')
你会得到具有全精度的预期的结果。
我试试。 可能不是很好。
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)和分母(杰诺)和精度值,可用于任何分数不只是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'