2017-07-19 33 views
1

我在程序中遇到了一些准确性问题,使用Decimal当提高到1的幂时,小数部分丢失精度。

一个简单的摄制:

from decimal import Decimal 

print Decimal(1910944005427272400562113336049664) 
print Decimal(1910944005427272400562113336049664)**1 
print int(Decimal(1910944005427272400562113336049664)**1) 

给出:

1910944005427272400562113336049664 
1.910944005427272400562113336E+33 
1910944005427272400562113336000000 

正如你可以看到,原来的价值已成为略小(减去49664确切地说)。

现在,我的实际代码做的不仅仅是将数字提高到1的幂,所以我最终导致精度下降。

有没有更好的Decimal在那里我可以使用?

我的输入和输出在0(含)和2^256(不含)之间。

+1

您刚刚使用整数算术吗? – Phylogenesis

+0

@Phylogenesis:不,它在标签中提到,但我应该在问题本身中强调它。顺便说一句,如果我只使用整数算术,那么我不需要'Decimal'开头,因为Python支持256位整数算术。 – goodvibration

回答

3

the documentation所述,“十进制模块具有用户可改变的精确度(默认为28个位置)”。您可以将精度设置为更高的值以获得准确的结果:

>>> decimal.getcontext().prec = 100 
>>> print(int(Decimal(1910944005427272400562113336049664)**Decimal(1))) 
1910944005427272400562113336049664 
+0

这是一个“全局”设置,还是我需要**每个** Decimal'实例? – goodvibration

+0

哦,全局的(从你的代码中很明显)。 – goodvibration

+0

'prec'的最大值是多少? – goodvibration