楼层划分和划分的运算符优先级

operator precedence of floor division and division

我无法理解为什么 python returns 这两个语句的结果不同:

-1 // 3/4-1 // 0.75

第一个 returns -0.25 第二个 returns -2.

按照我的理解,/ 运算符在 // 之前执行,因此这两个语句应该具有相同的结果。

编辑: 我指的是我的大学提供的文件。我误解了那个。官方 python 文档证明我错了。 感谢所有快速回答。

The way i understand it, the / operator is executed before // , thus those 2 statements should have the same result.

您的理解有误。 /// 具有相同的优先级并且具有左关联性,这意味着 Python 首先执行最左边的操作 - 在您的情况下,/.

根据 documentation/// 运算符具有相同的优先级,因此在同一表达式中使用时,它们的计算顺序是从左到右。 -1 // 3/4 因此等同于 (-1 // 3)/4 而不是 -1 // (3/4).

表达式文档中有一节是关于 Operator Precedence 的。同一框中的运算符具有相同的优先级。

因此,table 告诉您 /// 具有相同的优先级,因此

-1 // 3/4 解析为

>>> (-1//3)/4
>>> -0.25

不,它们具有相同的优先级,所以它们是从左到右计算的。

-1//3 是舍入(到最小整数)整数除法,所以你得到 -1 除以 40.25

当你有疑问的时候,加上几个括号并不会花费太多。

从操作顺序的角度考虑这些:

-1 // 3/4

这将执行 -1 "floor" 3,得到 -1,然后除以 4 得到 -0.25

鉴于:

-1 // 0.75

这将直接 "floor" 操作并产生 -2.0

根据文档,Multiplication *matrix multiplication @division /floor division //remainder % 都具有相同的优先级。

当两个运算符具有相同的优先级时,结合性有助于确定运算顺序。

现在关于你的问题; /// 都具有相同的优先级,如果它们都出现在表达式中,则根据 从左到右的关联性 首先计算左边的.

//本质上是地板除法运算符。

所以 1 // 0.75 本质上是地板 1.333,即 1

-1 // 0.75 本质上是地板 -1.333,即 -2。

希望这是有道理的。