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.floormath.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 的项 xx 为负时,为正,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