Python 距离零的下限或上限
Floor or Ceiling away from zero in Python
使用 Python 3,有没有比这样做更 Pythonic 的方法 floor/ceil 从零开始浮动:
import math
def away_from_zero(x):
if x > 0:
return int(math.ceil(x))
else:
return int(math.floor(x))
是否有更好(也许更优雅)的方法来获取具有更大绝对量级的最近整数?
编写已有函数的更优雅的方式是:
import math
def away_from_zero(x):
return int(math.floor(x) if x > 0 else math.ceil(x))
我不一定认为这更像 Pythonic,但如果您想避免调用 math.floor
和 math.ceiling
函数并正在寻找更代数的东西,您可以这样做:
def away_from_zero(x):
return int(x // 1 + 2 ** (x > 0) - 1)
作为解释:
整数除法 x // 1
会将任何浮点数(负数或正数)向下舍入为小于 x
的最接近整数。所以 1.5
转到 1.0
,-1.5
转到 -2.0
。仅此一项就解决了负值和整数的问题,但正 non-integers 是 off-by-one.
为了说明正例,我们希望在 x
为正时将结果偏移 1
而不是负时。您 可以 为此使用条件逻辑,但如果您想将计算限制为单个方程,您还可以添加一些等于 1
的项 x
当 x
为负时,为正,0
。为此,我们有 2 ** (x > 0) - 1
。这里,当 x
为正时,我们有
>>> 2 ** True - 1
1
当x
为负时,我们有
>>> 2 ** False - 1
0
最后,由于 float
returns 和 float
的整数除法,我们将结果转换为 int
,这给出了所需的行为:
>>> away_from_zero(1.4)
2
>>> away_from_zero(1.6)
2
>>> away_from_zero(-1.4)
-2
>>> away_from_zero(-1.6)
-2
使用 Python 3,有没有比这样做更 Pythonic 的方法 floor/ceil 从零开始浮动:
import math
def away_from_zero(x):
if x > 0:
return int(math.ceil(x))
else:
return int(math.floor(x))
是否有更好(也许更优雅)的方法来获取具有更大绝对量级的最近整数?
编写已有函数的更优雅的方式是:
import math
def away_from_zero(x):
return int(math.floor(x) if x > 0 else math.ceil(x))
我不一定认为这更像 Pythonic,但如果您想避免调用 math.floor
和 math.ceiling
函数并正在寻找更代数的东西,您可以这样做:
def away_from_zero(x):
return int(x // 1 + 2 ** (x > 0) - 1)
作为解释:
整数除法 x // 1
会将任何浮点数(负数或正数)向下舍入为小于 x
的最接近整数。所以 1.5
转到 1.0
,-1.5
转到 -2.0
。仅此一项就解决了负值和整数的问题,但正 non-integers 是 off-by-one.
为了说明正例,我们希望在 x
为正时将结果偏移 1
而不是负时。您 可以 为此使用条件逻辑,但如果您想将计算限制为单个方程,您还可以添加一些等于 1
的项 x
当 x
为负时,为正,0
。为此,我们有 2 ** (x > 0) - 1
。这里,当 x
为正时,我们有
>>> 2 ** True - 1
1
当x
为负时,我们有
>>> 2 ** False - 1
0
最后,由于 float
returns 和 float
的整数除法,我们将结果转换为 int
,这给出了所需的行为:
>>> away_from_zero(1.4)
2
>>> away_from_zero(1.6)
2
>>> away_from_zero(-1.4)
-2
>>> away_from_zero(-1.6)
-2