ChatGPT解决这个技术问题 Extra ChatGPT

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

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

>>> 6/3
2
>>> 6//3
2
引入//运算符进行整数除法的原因请参考The Problem with Integer Division

P
Peter Mortensen

在 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.2 开始“修复”除法! (只需阅读链接的 PEP)
还有python -Qnew。其他划分选项:-Qold(默认)、-Qwarn-Qwarnall
值得指出的是,5.0 / 2 在所有版本中都返回 2.55 / 2.0 也是如此 - 只有两个操作数都是 int 时,旧的行为才会有所不同。
当数字为负数时怎么办?负整数的行为是否相同?
@Srinivasu 你的例子没有帮助。更好的是 5 // 2(产生 2)和 -5 // 2(产生 -3)。
T
Tomerikoo

Python 2.x 说明:

为了澄清 Python 2.x 行,/ 既不是地板除法也不是真正的除法。

两个 args 都是 int 时,/ 是地板除法,但当 一个 args 都是 float 时是真正的除法。


P
Peter Mortensen

// 实现“地板除法”,无论您的类型如何。所以 1.0/2.0 会给出 0.5,但 1/21//21.0//2.0 都会给出 0

有关详细信息,请参阅 PEP 238: Changing the Division Operator


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

/ → 浮点除法

// → 楼层划分

让我们看看 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

这和 int(5/2) 一样吗?
当数字为负数时怎么办?负整数的行为是否相同?
Re: Negatives -- 行为相同,但请记住结果是底数,因此四舍五入总是向下朝向更负。一些例子:-100 // 33 => -4; 100 // -33 => -4;但由于 floor func 的舍入方向,与上一个相比,下一个似乎违反直觉:-100 // -33 => 3
@PirateApp - 只要结果为正,地板除法( x//y )与 int(x/y) 相同。如果结果为负,则它们不同 - int() 总是向零舍入,而除法总是向下舍入(即在数轴的左侧,或 -∞)。此外(如其他地方所述),特别大的值可能会发散 - 楼层除法将是精确的,因为它总是作为整数处理,而 int(x/y) 首先执行浮点计算,这是不精确的
u
u0b34a0f6ae

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

为什么这很重要,因为从 2.2 开始的所有 Python 版本(包括 Python 3.x 版本)中,// 都是明确的地板除法。

/ 的行为可能会根据:

主动 __future__ 导入与否(模块本地)

Python 命令行选项,-Q old 或 -Q new


J
Jonas Sciangula Street
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

没有意识到地板除法也适用于非整数。谢谢!
P
Peter Mortensen

Python 2.7 和其他即将发布的 Python 版本:

分配 (/)

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

示例:4 / 2 = 2

楼层划分 (//)

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

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

/ 除法和 // 楼层除法运算符都以类似的方式运行。


T
ThinkingStiff

双斜线 // 是地板除法:

>>> 7//3
2

P
Peter Mortensen

// 是楼层划分。它总是会给你结果的整数下限。另一个是“常规”划分。


P
Peter Mortensen

前面的答案很好。我想补充一点。直到某些值,它们都导致相同的商。在该楼层除法运算符 (//) 工作正常但除法 (/) 运算符之后:

>>> int(755349677599789174 / 2) # Wrong answer
377674838799894592
>>> 755349677599789174 // 2     # Correct answer
377674838799894587

G
G.Ant

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

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0

n
naoki fujita

概括

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)
我们得到一个错误当重要性的损失不容忽视时的结果。


关于“x//y 精确整数除法”:这听起来不合理。你能提供一些参考吗?
documentation 表示:整数具有无限精度
v
villamejia

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)


i
iacob

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


P
Peter Mortensen

// 是楼层划分。它总是会给你结果的底值。

另一个,/,是浮点除法。

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

这个答案如何添加其他想法未涵盖的任何内容?或者这个答案在任何方面比其他答案更好?
下面是一个程序的输出。它什么也没解释。
P
Peter Mortensen

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

Python 促进将较低数据类型(整数)转换为较高数据类型(浮点数)以避免数据丢失。