负数楼层划分
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
等生成序列时。
【讨论】:
以上是关于负数楼层划分的主要内容,如果未能解决你的问题,请参考以下文章