如何在Python 3.x中从0舍入?

pla*_*etp 7 python python-2.7 python-3.x

在Python 2 舍入完成远离0,所以,例如,round(0.5)1.0.
但是,在Python 3.x中,舍入是针对偶数选择进行的,因此round(0.5) 也是如此0.
我可以在Python 3.x中使用什么函数来获取旧行为?

kri*_*aps 6

如果您的代码对性能不是特别敏感,则可以使用标准decimal库来实现所需的结果.Decimal().quantize()允许选择舍入方法:

from decimal import Decimal, ROUND_HALF_UP
result = float(Decimal(0.5).quantize(Decimal(0), rounding=ROUND_HALF_UP))
print(result)  # Will output 1.0
Run Code Online (Sandbox Code Playgroud)


AGN*_*zer 5

round()舍入为整数(单参数)时相当于 Python 2.7 :

import math
def py2round(x):
    if x >= 0.0:
        return math.floor(x + 0.5)
    else:
        return math.ceil(x - 0.5)
Run Code Online (Sandbox Code Playgroud)

另一种选择更简洁,但对于标量值来说更昂贵:

def py2round(x):
    return int(math.copysign(math.floor(abs(x) + 0.5), x))
Run Code Online (Sandbox Code Playgroud)

math然而,如果替换为numpy(但对于标量来说非常慢),它对于大向量的性能要高得多:

import numpy as np
def py2round(x):
    return np.copysign(np.floor(abs(x) + 0.5), x).astype(int)
Run Code Online (Sandbox Code Playgroud)


jde*_*esa -1

这是我想出的一个可能的解决方案:

import math

def round_away_from_zero(x):
    a = abs(x)
    r = math.floor(a) + math.floor(2 * (a % 1))
    return r if x >= 0 else -r
Run Code Online (Sandbox Code Playgroud)

测试:

round_away_from_zero(0.5)
# 1
round_away_from_zero(1.5)
# 2
round_away_from_zero(2.5)
# 3
round_away_from_zero(-0.5)
# -1
round_away_from_zero(-1.5)
# -2
round_away_from_zero(-2.5)
# -3
Run Code Online (Sandbox Code Playgroud)