当将较大的整数与除以它们的数字相除时,我从除法
/
和底除法 //
得到不同的结果。
例如:
In [1]: a = 123456789012345678
In [2]: int(a/2)
Out[2]: 61728394506172840
In [3]: a//2
Out[3]: 61728394506172839
很明显 2|a 和 out[3] 是正确答案,那么为什么除法运算符不一致呢?到底是怎么回事?以及,如何让
/
行为正确?
/
是浮动除法运算符,因此您的整数存储为 float 类型。这种类型不能准确地存储每个值,只能存储近似值,请参阅:
>>> a = 123456789012345678
>>> a/2
6.172839450617284e+16
你输掉了最后一位数字...
123456789012345678
大约等于 6.172839450617284 * 10^16。
看看“巨大”数字会发生什么:
>>> float(1234512345123451234512345)
1.2345123451234512e+24
浮点数基本上是具有固定大小尾数的科学记数法。
虽然
//
是整数除法运算符,并且整数类型(在Python中)是任意精度的(仅在整数域中):
>>> 2**1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Python 对浮点数和整数都使用 64 位。
你的第一个计算
/
对双浮点值进行除法,它可以存储更大的数字但不太准确。第二次除法 //
是在 64 位整数上执行的,在这种情况下没有舍入问题。