负数楼层划分

Posted

技术标签:

【中文标题】负数楼层划分【英文标题】:Floor division with negative number 【发布时间】:2016-05-17 18:30:42 【问题描述】:

表达式6 // 4 产生1,其中地板除法产生除数后的整数。

但是用负数,为什么-6 // 4返回-2

【问题讨论】:

因为那是楼层划分。 -2 < -6/4 < -1 很奇怪的问题,你自己给答案 因为除法的结果是总是取底。地板是下降,而不是上升。 -6/4 = -1.5 将其四舍五入,得到-2 因此floor,而不是ceiling 【参考方案1】:

// 运算符明确楼层结果。引用Binary arithmetic operations documentation:

结果是数学除法,结果应用了“floor”函数。

Flooring 和四舍五入到 0 不是一回事;地板总是移动到较低的整数值。见math.floor() function:

返回x的下限,小于等于x的最大整数。

对于-6 // 4,首先计算-6 / 4的结果,所以-1.5。地板然后移动到较低的整数值,所以-2

如果您想向零舍入,则必须明确地这样做;你可以用 int() 函数在真正的除法上做到这一点:

>>> int(-6 / 4)
-1

int() 删除小数部分,因此总是向零舍入。

【讨论】:

这是提及int()的好答案【参考方案2】:

楼层划分也将向下舍入到下一个最小的数字,而不是下一个最小的绝对值。

6 // 4 = 1.5,向下取整到 1,最多取整到 2。

-6 // 4 = -1.5,向下舍入为 -2,向上舍入为 -1。

【讨论】:

【参考方案3】:

// 在 Python 中是一个“地板除法”运算符。这意味着这种除法的结果是正则除法结果的底(用 / 运算符执行)。

给定数字的下限是小于这个数字的最大整数。例如

7 / 2 = 3.5 so 7 // 2 = floor of 3.5 = 3.

对于负数,它不太直观:-7 / 2 = -3.5, 所以-7 // 2 = floor of -3.5 = -4。同样-1 // 10 = floor of -0.1 = -1.

// 被定义为与math.floor() 做同样的事情:返回小于或等于浮点结果的最大整数值。 Zero is not less than or equal to -0.1.

【讨论】:

【参考方案4】:

理解为什么地板除法 // 产生负值结果的一种有用方法是将其视为对模数或余数 % 运算符的补充。

5/3  is equivalent to 1 remainder 2 

5//3 = 1
5%3 = 2

但是

-5/3 = -2
-5%3 = 1

或者

-2 + 1/3rd which is -1.6667 (ish)

这可能看起来很奇怪,但它可以确保结果,例如 -2,-2,-2,-1,-1,-1,0,0,0,1,1,1,2,2,2,3,3,3 等生成序列时。

【讨论】:

以上是关于负数楼层划分的主要内容,如果未能解决你的问题,请参考以下文章

中小型企业网络构建之综合布线和子网划分

nasm idiv 负值

模块划分方法

DP专题:划分数问题

划分数系列问题

整数划分dp