a//b和int(a/b)有什么区别?

4

他们在小数字上看起来一样,但在较大数字上不同。

例如:

a = int(1267650600228229401496703205376/10)
b = 1267650600228229401496703205376 // 10
print(a - b) # prints 7036874417767

a = int(1493845793475/10)
b = 1493845793475 // 10
print(a - b) # prints 0

怎么回事?

2
int(a/b)会朝着零方向截断。 - Willem Van Onsem
2
在Python3中,a/b将执行浮点除法,这是不精确的。即使您将结果转换为int,您已经引入了不精确性。 - khelwood
1
这仅适用于Python 3。对于Python 2,在两种情况下都会返回0。 - nick_gabpe
为什么浮点数算术很难 - JanHak
4个回答

4

除了现有的答案外,值得一提的是,您不必走那么远来观察差异:

>>> -1//2
-1
>>> int(-1/2)
0

是的,但这种差异是由于完全不同的因素 - 即“//”使用地板除法。 OP所问的问题是由于浮点不精确性引起的。 - B. Eckles
1
@B.Eckles 嗯,我说的是“补充”; 肯定应该是答案的一部分,因为标题问题是“a // b和int(a / b)之间的区别是什么?” - Paul Panzer
没错。收到了。 :-) - B. Eckles

3
在Python 3中,/执行浮点除法,精度为53位; //执行地板除法,当两个操作数都是整数时没有精度限制(除了可用RAM所施加的限制)。
您可以通过使用true_division __future__导入在Python 2中获得Python 3的行为。

1
如@khelwood所解释的,在Python 3中,a/b执行浮点除法。尝试在解释器中键入1/2-您将得到0.5,而不是0。
因此,在您的示例中,实际上1267650600228229401496703205376 / 10等于126765060022822940149670320537.6 = 1.267650600228229401496703205376e+29(浮点除法),但由于浮点数的不精确性,Python将其评估为1.2676506002282295e+29,因此您已经失去了精度,这就是差异的原因。
请参见PEP 238

0
  1. 整数除法a//b的结果

    a=4//3=1

  2. 浮点数除法a/b的结果

    a=4/3=1.33333


您的答案可以加入更多支持信息以改进。请编辑并添加更多详细信息,例如引用或文献,以便他人确认您的答案正确无误。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接