是否有一个内置函数可以像下面这样舍入?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
是否有一个内置函数可以像下面这样舍入?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
当前回答
如果有人需要“财务四舍五入”(0.5位总是向上):
def myround(x, base=5):
roundcontext = decimal.Context(rounding=decimal.ROUND_HALF_UP)
decimal.setcontext(roundcontext)
return int(base *float(decimal.Decimal(x/base).quantize(decimal.Decimal('0'))))
根据文档,其他舍入选项是:
ROUND_CEILING(朝向无限) ROUND_DOWN(趋近于零) ROUND_FLOOR(朝向-∞) ROUND_HALF_DOWN(当平局趋于0时最接近) ROUND_HALF_EVEN(最接近偶数) ROUND_HALF_UP(到最接近的平局从0开始) ROUND_UP(远离零) ROUND_05UP(如果四舍五入后的最后一位为0或5,则远离0;否则趋于零)
默认情况下,Python使用ROUND_HALF_EVEN,因为它有一些统计优势(四舍五入的结果没有偏见)。
其他回答
def round_up_to_base(x, base=10):
return x + (base - x) % base
def round_down_to_base(x, base=10):
return x - (x % base)
这给了
基础= 5:
>>> [i for i in range(20)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> [round_down_to_base(x=i, base=5) for i in range(20)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15]
>>> [round_up_to_base(x=i, base=5) for i in range(20)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20]
基础= 10:
>>> [i for i in range(20)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> [round_down_to_base(x=i, base=10) for i in range(20)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
>>> [round_up_to_base(x=i, base=10) for i in range(20)]
[0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20]
在Python 3.7.9中测试
舍入到非整数值,例如0.05:
def myround(x, prec=2, base=.05):
return round(base * round(float(x)/base),prec)
我发现这很有用,因为我只需要在代码中进行搜索和替换,就可以将“round(”更改为“myround(”,而不必更改参数值。
去掉“rest”会起作用:
rounded = int(val) - int(val) % 5
如果该值是一个整数:
rounded = val - val % 5
作为函数:
def roundint(value, base=5):
return int(value) - int(value) % int(base)
另一种方法(不需要显式的乘法或除法运算符):
def rnd(x, b=5):
return round(x + min(-(x % b), b - (x % b), key=abs))
divround的修改版本:-)
def divround(value, step, barrage):
result, rest = divmod(value, step)
return result*step if rest < barrage else (result+1)*step