用于除法时,“/”和“//”有什么区别?

What is the difference between '/' and '//' when used for division?

提问人:Ray 提问时间:10/9/2008 最后编辑:GeorgyRay 更新时间:2/6/2022 访问量:704232

问:

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

>>> 6/3
2
>>> 6//3
2
Python 数学 语法 运算符 floor-division

评论

3赞 Sriram 10/30/2009
请参考整数除法的问题,了解引入算子做整数除法的原因。//

答:

6赞 Adam Bellaire 10/9/2008 #1

//是楼层划分。它将始终为您提供结果的整数下限。另一种是“常规”划分。

5赞 Mark Roddy 10/9/2008 #2

双斜杠 , 是楼层划分://

>>> 7//3
2
38赞 Kena 10/9/2008 #3

//无论您的类型如何,都可以实现“楼层划分”。所以会给 ,但两者都会给 ,并且会给 。1.0/2.00.51/21//21.0//2.00

有关详细信息,请参见 PEP 238:更改除法运算符

评论

0赞 Scott Lowrey 4/16/2015
这是一个很好的答案。PEP 链接很有帮助。另外,如果您不确定一元运算符发生了什么,请考虑使用 或 。math.floor()math.fmod()
0赞 iono 7/30/2019
/并且是双元运算符(两个操作数,左和右,分子和分母)//
778赞 Eli Courtwright 10/9/2008 #4

在 Python 3.x 中,将返回 并将返回 。前者是浮点除法,后者是地板除法,有时也叫整数除法5 / 22.55 // 22

在 Python 2.2 或更高版本的 2.x 行中,整数没有区别,除非您执行 ,这会导致 Python 2.x 采用 3.x 行为。from __future__ import division

无论将来导入如何,都将返回,因为这是操作的地板划分结果。5.0 // 22.0

您可以在 PEP 238:更改除法运算符中找到详细说明。

评论

2赞 John La Rooy 11/10/2009
也。其他除法选项:(默认)、、python -Qnew-Qold-Qwarn-Qwarnall
2赞 Chris 8/17/2016
值得指出的是,所有版本的返回都是如此 - 只有当两个操作数都是 时,旧行为才会有所不同。5.0 / 22.55 / 2.0int
2赞 Aaron Franke 3/30/2018
当数字为负数时呢?负整数的行为是否相同?
1赞 Marvin 1/25/2019
@Srinivasu 你的例子没有帮助。更好的是 5 // 2(产生 2)和 -5 // 2(产生 -3)。
1赞 Utkan Gezer 10/9/2022
暗示楼层除法是整数除法的同义词是令人困惑的。Afaik,-7 除以 2 是整数除法的 -3,底除法的 -4,所以它们是不同的。
23赞 u0b34a0f6ae 11/10/2009 #5

正如大家已经回答的那样,是楼层划分。//

为什么这很重要,因为在 2.2 的所有 Python 版本(包括 Python 3.x 版本)中,这都是明确的底线划分。//

的行为可能会根据以下因素而改变:/

  • 是否处于活动状态导入(模块本地)__future__
  • Python 命令行选项,或-Q old-Q new
78赞 npnmodp 7/23/2012 #6

Python 2.x 说明:

澄清一下 Python 2.x 行,既不是楼层除法,也不是真正的除法。/

/两个参数都为 时,是楼层除法,但当一参数为 时,是真除法。intfloat

13赞 Jonas Sciangula Street 3/19/2014 #7
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

评论

3赞 Mike 11/25/2014
没有意识到楼层除法也适用于非整数。谢谢!
2赞 G.Ant 6/3/2015 #8

等式的答案四舍五入到下一个较小的整数或浮点数,并以 .0 作为小数点。

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0
36赞 N Randhawa 7/24/2016 #9

/→ 浮点除法

//→ 地板事业部

让我们看看 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 中相同的输出,您可以执行以下操作:

蟒蛇 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

评论

0赞 PirateApp 3/20/2018
这和 int(5/2) 一样吗?
1赞 Aaron Franke 3/30/2018
当数字为负数时呢?负整数的行为是否相同?
2赞 Erdős-Bacon 8/6/2019
回复:负数 -- 行为是相同的,但请记住,结果是下限,因此舍入总是向下到更负数。一些例子:=> -4; => -4;但是由于地板函数的四舍五入方向,与上一个相比,下一个似乎有悖常理:=> 3-100 // 33100 // -33-100 // -33
1赞 askvictor 4/29/2022
@PirateApp - 地板除法 ( x//y ) 与 int(x/y) 相同,只要结果是正的。如果结果为负数,则它们不同 - int() 总是向零四舍五入,而地板除法总是向下舍入(即在数字线的左侧,或 -∞)。此外(如前所述),特别大的值可能会发散 - 地板除法将是精确的,因为它总是作为整数处理,而 int(x/y) 首先执行浮点计算,这是不精确的
7赞 Abrar Ahmad 2/5/2017 #10

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

  • 分部 (/)

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

例:4 / 2 = 2

  • 楼层划分 (//)

操作数的除法,其中结果是去掉小数点后数字的商。但是,如果其中一个操作数为负数,则结果为底数,即从零(向负无穷大)四舍五入:

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

分区和楼层分区运营商的运作方式相似。///

-2赞 Sebastian Purakan 11/10/2018 #11

5.0//2结果为 ,而不是 ,因为运算符返回值的返回类型遵循 Python 强制(类型转换)规则。2.02//

Python 促进了较低数据类型(整数)到较高数据类型(浮点数)的转换,以避免数据丢失。

0赞 Fatema Tuz Zuhora 3/24/2019 #12
  • //是楼层划分。它将始终为您提供结果的下限值。
  • 另一个是浮点除法。/

以下是 和 之间的区别; 我已经在 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

评论

3赞 Rory Daulton 3/24/2019
这个答案如何添加其他想法没有涵盖的任何内容?或者这个答案在任何方面都比其他答案更好?
3赞 user207421 6/6/2019
以下是程序的输出。它什么也解释不了。
4赞 jaya ram 6/6/2019 #13

前面的答案很好。我想补充一点。在一些值上,它们都会产生相同的商。之后,楼层除法运算符 () 工作正常,但除法 () 运算符工作不正常:///

>>> int(755349677599789174 / 2) # Wrong answer
377674838799894592
>>> 755349677599789174 // 2     # Correct answer
377674838799894587
1赞 villamejia 2/14/2021 #14

Python 3.x 澄清

只是为了补充之前的一些答案。

需要注意的是:

a // b

  • 楼层划分。如:

    数学地板(a/b)

  • 不是 int 除法。如:

    整数(a/b)

  • 不是四舍五入到 0 浮点除法。如:

    圆形(a/b,0)

因此,当涉及到正数和负数时,行为方式是不同的,如以下示例所示:

1 // 2 为 0,如下所示:

数学地板(1/2)

-1 // 2 是 -1,如下所示:

数学地板(-1/2)

1赞 iacob 3/28/2021 #15

蟒蛇 3

操作 结果 笔记
x / y xy 的商
x // y xy 的底商 (1)

笔记:

  1. 也称为整数除法。结果值是一个整数,但结果的类型不一定是 int。结果总是向负无穷大四舍五入:是、是、是和是。1//20(-1)//2-11//(-2)-1(-1)//(-2)0

蟒蛇 2

操作 结果 笔记
x / y xy 的商 (1)
x // y xy 的(底数)商 (4)(5)

笔记:

1. 对于(普通或长)整数除法,结果为整数。结果始终向负无穷大四舍五入:1/2 为 0,(-1)/2 为 -1,1/(-2) 为 -1,(-1)/(-2) 为 0。请注意,如果任一操作数是长整数,则结果为长整数,而不考虑数值。

4. 自 2.3 版起不推荐使用:不再为复数定义楼层除法运算符、模运算符和 divmod() 函数。相反,如果适用,请使用 abs() 函数转换为浮点数。

5.也称为整数除法。结果值是一个整数,但结果的类型不一定是 int。

0赞 naoki fujita 7/29/2021 #16

总结

  • 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

考虑

我想到了对 .
首先,Python计算表达式并得到INACT浮点数z。 其次,Python计算表达式。

当重要性的丧失不容忽视时,我们会得到一个错误的结果。
int(x/y)x/yint(z)

评论

0赞 Peter Mortensen 1/30/2022
Re “x//y EXACT integer division”:这听起来合理。你能提供一些参考资料吗?
0赞 oittaa 2/6/2022
文档说:整数具有无限的精度