使用一个比另一个有好处吗?在 Python 2 中,它们似乎都返回相同的结果:
>>> 6/3
2
>>> 6//3
2
//
运算符进行整数除法的原因请参考The Problem with Integer Division。
在 Python 3.x 中,5 / 2
将返回 2.5
,而 5 // 2
将返回 2
。前者为浮点除法,后者为地板除法,有时也称为整数除法。
在 Python 2.2 或更高版本的 2.x 行中,整数没有区别,除非您执行 from __future__ import division
,这会导致 Python 2.x 采用 3.x 行为。
无论将来如何导入,5.0 // 2
都将返回 2.0
,因为这是运算的地板除法结果。
您可以在 PEP 238: Changing the Division Operator 找到详细说明。
Python 2.x 说明:
为了澄清 Python 2.x 行,/
既不是地板除法也不是真正的除法。
当 两个 args 都是 int
时,/
是地板除法,但当 一个 args 都是 float
时是真正的除法。
//
实现“地板除法”,无论您的类型如何。所以 1.0/2.0
会给出 0.5
,但 1/2
、1//2
和 1.0//2.0
都会给出 0
。
有关详细信息,请参阅 PEP 238: Changing the Division Operator。
math.floor()
或 math.fmod()
。
/
和 //
是二元运算符(两个操作数,左右,分子和分母)
/ → 浮点除法
// → 楼层划分
让我们看看 Python 2.7 和 Python 3.5 中的一些示例。
Python 2.7.10 与 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
-100 // 33
=> -4; 100 // -33
=> -4;但由于 floor func 的舍入方向,与上一个相比,下一个似乎违反直觉:-100 // -33
=> 3。
正如大家已经回答的那样,//
是楼层划分。
为什么这很重要,因为从 2.2 开始的所有 Python 版本(包括 Python 3.x 版本)中,//
都是明确的地板除法。
/
的行为可能会根据:
主动 __future__ 导入与否(模块本地)
Python 命令行选项,-Q old 或 -Q new
>>> print 5.0 / 2
2.5
>>> print 5.0 // 2
2.0
Python 2.7 和其他即将发布的 Python 版本:
分配 (/)
将左手操作数除以右手操作数
示例:4 / 2 = 2
楼层划分 (//)
操作数的除法,其结果是除去小数点后的数字的商。但如果其中一个操作数为负数,则结果为下限,即从零四舍五入(向负无穷大):
示例:9//2 = 4
和 9.0//2.0 = 4.0
、-11//3 = -4
、-11.0//3 = -4.0
/
除法和 //
楼层除法运算符都以类似的方式运行。
双斜线 //
是地板除法:
>>> 7//3
2
//
是楼层划分。它总是会给你结果的整数下限。另一个是“常规”划分。
前面的答案很好。我想补充一点。直到某些值,它们都导致相同的商。在该楼层除法运算符 (//
) 工作正常但除法 (/
) 运算符之后:
>>> int(755349677599789174 / 2) # Wrong answer
377674838799894592
>>> 755349677599789174 // 2 # Correct answer
377674838799894587
等式的答案四舍五入到下一个较小的整数或以 .0 作为小数点的浮点数。
>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0
概括
x//y : 精确整数除法
int(x/y) OR math.floor(x/y):不精确的整数除法(但几乎正确)
x/y:浮点除法(失去意义)
卓越的计算结果
import math
N = 1004291331219602346 # huge number
print(N//100) #=> 10042913312196023 is correct answer
print(math.floor(N/100)) #=> 10042913312196024 is wrong answer
print(math.ceil(N/100)) #=> 10042913312196024 is wrong answer
print(int(N/100)) #=> 10042913312196024 is wrong answer
考虑
我想到了 int(x/y)
的求值。
首先,Python 求值表达式 x/y
并得到 INEXACT 浮点数 z。
第二,Python 求值表达式 int(z)
。
我们得到一个错误当重要性的损失不容忽视时的结果。
Python 3.x 说明
只是为了补充一些以前的答案。
重要的是要注意:
a // b
是楼层划分。如:math.floor(a/b)
不是int除法。如: int(a/b)
不是四舍五入到 0 浮点除法。如:round(a/b,0)
因此,当涉及到正数和负数时,行为方式是不同的,如下例所示:
1 // 2 为 0,如:
数学.地板(1/2)
-1 // 2 是 -1,如:
数学.地板(-1/2)
蟒蛇 3
运算结果 注释 x 和 yx 的 x / y 商 // x 和 y 的 y 底商 (1) 注释:也称为整数除法。结果值是一个整数,尽管结果的类型不一定是 int。结果总是向负无穷大四舍五入:1//2 为 0,(-1)//2 为 -1,1//(-2) 为 -1,(-1)//(-2) 为0。
蟒蛇2
运算结果注释 x 和 y 的 x / y 商 (1) x // x 和 y 的 y (floored) 商 (4)(5) 注释: 1. 对于(plain 或 long)整数除法,结果为整数.结果总是向负无穷大四舍五入:1/2 为 0,(-1)/2 为 -1,1/(-2) 为 -1,(-1)/(-2) 为 0。请注意如果任一操作数是长整数,则无论数值如何,结果都是长整数。 4. 自 2.3 版起已弃用:不再为复数定义底除法运算符、模运算符和 divmod() 函数。相反,如果合适,请使用 abs() 函数转换为浮点数。 5. 也称为整数除法。结果值是一个整数,尽管结果的类型不一定是 int。
// 是楼层划分。它总是会给你结果的底值。
另一个,/,是浮点除法。
以下是/
和//
的区别;我已经在 Python 3.7.2 中运行了这些算术运算。
>>> print (11 / 3)
3.6666666666666665
>>> print (11 // 3)
3
>>> print (11.3 / 3)
3.7666666666666667
>>> print (11.3 // 3)
3.0
5.0//2
产生 2.0
而不是 2
,因为 //
运算符的返回值的返回类型 遵循 Python 强制(类型转换)规则。
Python 促进将较低数据类型(整数)转换为较高数据类型(浮点数)以避免数据丢失。
python -Qnew
。其他划分选项:-Qold
(默认)、-Qwarn
、-Qwarnall
5.0 / 2
在所有版本中都返回2.5
,5 / 2.0
也是如此 - 只有两个操作数都是int
时,旧的行为才会有所不同。