使用除法时,'/'和'//'有什么区别?

583

使用其中一个有什么好处吗?在Python 2中,它们似乎都会返回相同的结果:

>>> 6/3
2
>>> 6//3
2

3
请参考整除问题了解为什么引入了 // 操作符来进行整数除法。 - Sriram
16个回答

778
在Python 3.x中,5 / 2将返回2.5,而5 // 2将返回2。前者是浮点数除法,后者是地板除法,有时也称为整数除法
在Python 2.2或2.x系列的更高版本中,对于整数没有区别,除非执行from __future__ import division,这会导致Python 2.x采用3.x的行为。
无论使用future import与否,5.0 // 2将返回2.0,因为这是该操作的地板除法结果。
您可以在PEP 238: Changing the Division Operator找到详细说明。

2
还有python -Qnew。其他的除法选项包括:-Qold(默认)、-Qwarn-Qwarnall - John La Rooy
2
值得指出的是,在所有版本中,5.0 / 25 / 2.0 均返回 2.5,只有当两个操作数均为“int”时,旧行为才有所不同。 - Chris
2
当数字为负数时怎么办?负整数的行为是否相同? - Aaron Franke
1
@Srinivasu,你的示例没有帮助。更好的示例是5 // 2(得到2),-5 // 2(得到-3)。 - Marvin
在Python 2.7.15中,“//”的行为与Python 3相同。 - Alberto Perez
1
将“floor division”暗示为“integer division”的同义词是令人困惑的。据我所知,-7除以2在使用整数除法时为-3,在使用floor division时为-4,因此它们是不同的。 - Utkan Gezer

78

Python 2.x 澄清:

针对 Python 2.x 系列,/ 既不是地板除法也不是真正的除法。

两个参数都是 int 类型时,/ 表示地板除法,但当 任意一个 参数为 float 类型时,表示真正的除法。


38

这是一个很好的答案。PEP链接很有帮助。此外,如果您不确定一元运算符的操作,请考虑使用math.floor()math.fmod() - Scott Lowrey
/// 是二元运算符(有两个操作数,左右、分子分母)。 - iono

36

/ → 浮点数除法

// → 向下取整除法

让我们在Python 2.7和Python 3.5中看一些例子。

Python 2.7.10 vs. Python 3.5

print (2/3)  ----> 0                   Python 2.7
print (2/3)  ----> 0.6666666666666666  Python 3.5

Python 2.7.10与Python 3.5的区别

print (4/2)  ----> 2         Python 2.7
print (4/2)  ----> 2.0       Python 3.5

现在如果你想要在Python 2.7中获得与Python 3.5相同的输出,可以执行以下操作:

Python 2.7.10

from __future__ import division
print (2/3)  ----> 0.6666666666666666   # Python 2.7
print (4/2)  ----> 2.0                  # Python 2.7

Python 2.7和Python 3.5中的地板除法并没有区别。

138.93//3 ---> 46.0        # Python 2.7
138.93//3 ---> 46.0        # Python 3.5
4//3      ---> 1           # Python 2.7
4//3      ---> 1           # Python 3.5

这是否与int(5/2)相同? - PirateApp
1
当数字为负数时怎么办?负整数的行为是否相同? - Aaron Franke
2
回复:负数 - 行为是相同的,但请记住结果是向下取整,因此始终向更负面的方向舍入。一些例子:-100 // 33 => -4100 // -33 => -4;但由于 floor 函数的舍入方向,与前面的比较,下一个可能看起来违反直觉:-100 // -33 => 3 - Erdős-Bacon
1
@PirateApp - 地板除法(x // y)与int(x / y)相同,只要结果为正数。 如果结果为负,则它们不同-int()始终向零四舍五入,而地板除法始终向下舍入(即在数字线左侧或-∞)。 此外(如其他地方所述),特别大的值可能会发散-floor division将是精确的,因为它始终被处理为整数,而int(x / y)首先执行浮点计算,这是不精确的。 - askvictor

23

正如其他人已经回答的那样,// 是地板除法。

这很重要的原因是,在所有 Python 2.2 及其以上版本,包括 Python 3.x 版本中,// 的行为都是明确的地板除法。

/ 的行为可能会因以下原因而变化:

  • 活动的 __future__ 导入与否(模块局部)
  • Python 命令行选项,即 -Q old-Q new

13
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

3
没意识到地板除法也能用于非整数,谢谢! - Mike

7

Python 2.7及其他即将推出的版本:

  • 除法 (/)

将左操作数除以右操作数。

示例: 4 / 2 = 2

  • 整数除法 (//)

操作数相除,结果是去除小数点后的商。但如果其中一个操作数为负数,则向下取整,即远离零(朝负无穷大):

示例:9//2 = 49.0//2.0 = 4.0-11//3 = -4-11.0//3 = -4.0

除法运算符/和整数除法运算符//的操作方式类似。


6

// 表示地板除法,总是返回结果的整数部分。另一种是“常规”除法。


5
双斜杠//表示地板除法:
>>> 7//3
2

4
之前的回答很好。我想再补充一点。在某些值之前,它们都会产生相同的商数。之后,地板除法运算符 (//) 可以正常工作,但除法 (/) 运算符不行:
>>> int(755349677599789174 / 2) # Wrong answer
377674838799894592

>>> 755349677599789174 // 2     # Correct answer
377674838799894587

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