是否有一个内置函数可以像下面这样舍入?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
是否有一个内置函数可以像下面这样舍入?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
当前回答
Use:
>>> def round_to_nearest(n, m):
r = n % m
return n + m - r if r + r >= m else n - r
它不使用乘法,也不会从/转换为浮点数。
四舍五入到最接近10的倍数:
>>> for n in range(-21, 30, 3): print('{:3d} => {:3d}'.format(n, round_to_nearest(n, 10)))
-21 => -20
-18 => -20
-15 => -10
-12 => -10
-9 => -10
-6 => -10
-3 => 0
0 => 0
3 => 0
6 => 10
9 => 10
12 => 10
15 => 20
18 => 20
21 => 20
24 => 20
27 => 30
如你所见,它对负数和正数都适用。平局(例如-15和15)总是向上四舍五入。
一个类似的例子,四舍五入到5的最接近倍数,证明它也表现为不同的“基数”:
>>> for n in range(-21, 30, 3): print('{:3d} => {:3d}'.format(n, round_to_nearest(n, 5)))
-21 => -20
-18 => -20
-15 => -15
-12 => -10
-9 => -10
-6 => -5
-3 => -5
0 => 0
3 => 5
6 => 5
9 => 10
12 => 10
15 => 15
18 => 20
21 => 20
24 => 25
27 => 25
其他回答
对不起,我想对阿洛克辛格海的回答发表评论,但由于缺乏声誉,它不让我评论=/
总之,我们可以再归纳一步:
def myround(x, base=5):
return base * round(float(x) / base)
这允许我们使用非整数进制,如。25或任何其他分数进制。
的值加上0.5,可以“欺骗”int()使其舍入而不是舍入 传递给int()的数字。
舍入到非整数值,例如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)
divround的修改版本:-)
def divround(value, step, barrage):
result, rest = divmod(value, step)
return result*step if rest < barrage else (result+1)*step