当一个大整数的长度超过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.
答案 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:
不幸的是,大多数小数部分不能完全表示为 二进制分数。结果是,一般来说,十进制 您输入的浮点数仅由二进制近似 实际存储在机器中的浮点数。