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中使用什么函数来获取旧行为?
如果您的代码对性能不是特别敏感,则可以使用标准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)
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)
归档时间: |
|
查看次数: |
1075 次 |
最近记录: |