使用python 2.7进行整数精度

时间:2016-06-20 11:19:32

标签: python-2.7

当一个大整数的长度超过15时,最后一位数字设置为0.我怎么能避免这种情况?例如,

a=[1,100,20,167,52,96,181,0]
b = 0
for i in range(8):
    b = b + a[i]*(2**(8*(i)))
    print a[i]
print "%f" % b

b是51052750042326016,但实际值应为51052750042326017.

2 个答案:

答案 0 :(得分:1)

来自Floating Point Limitations页面:

  

在运行Python的典型机器上,有53位精度   可用于Python浮动

因此:

>>> a = 2 ** 53 + 1
>>> a
9007199254740993L
>>> int(float(a))
9007199254740992L

在上面的示例中,通过在%f中使用格式print,您可以隐式将整数b转换为浮点数。由于它的大小大于Python中可以用float表示的大小,因此给出了最接近的53位表示。

避免这种情况的最简单方法是将整数打印为整数,格式为%d

答案 1 :(得分:0)

在您的代码中,b被分配给一个整数,而不是浮点类型,因此您可以使用"%d"格式进行打印。浮点值具有此issue and limitation,因为它们在计算机硬件中表示为基数2(二进制)分数:

a=[1,100,20,167,52,96,181,0]
b = 0
for i in range(8):
    b = b + a[i]*(2**(8*(i)))
    print a[i]
print "%d" % b

print "%d %f" % (b, b)的输出:

51052750042326017 51052750042326016.000000

来自docs

  

不幸的是,大多数小数部分不能完全表示为   二进制分数。结果是,一般来说,十进制   您输入的浮点数仅由二进制近似   实际存储在机器中的浮点数。