为什么 python 中的除法“/”和底除法“//”运算符对于余数 = 0 的除法给出不同的结果?

问题描述 投票:0回答:2

当将较大的整数与除以它们的数字相除时,我从除法

/
和底除法
//
得到不同的结果。

例如:

In [1]: a = 123456789012345678

In [2]: int(a/2)
Out[2]: 61728394506172840

In [3]: a//2
Out[3]: 61728394506172839

很明显 2|a 和 out[3] 是正确答案,那么为什么除法运算符不一致呢?到底是怎么回事?以及,如何让

/
行为正确?

python integer-division
2个回答
3
投票

/
是浮动除法运算符,因此您的整数存储为 float 类型。这种类型不能准确地存储每个值,只能存储近似值,请参阅:

>>> a = 123456789012345678
>>> a/2
6.172839450617284e+16

你输掉了最后一位数字...

123456789012345678
大约等于 6.172839450617284 * 10^16。 看看“巨大”数字会发生什么:

>>> float(1234512345123451234512345)
1.2345123451234512e+24

浮点数基本上是具有固定大小尾数的科学记数法。

虽然

//
是整数除法运算符,并且整数类型(在Python中)是任意精度的(仅在整数域中):

>>> 2**1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

-2
投票

Python 对浮点数和整数都使用 64 位。

你的第一个计算

/
对双浮点值进行除法,它可以存储更大的数字但不太准确。第二次除法
//
是在 64 位整数上执行的,在这种情况下没有舍入问题。

© www.soinside.com 2019 - 2024. All rights reserved.