是否有一个内置函数可以像下面这样舍入?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
是否有一个内置函数可以像下面这样舍入?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
当前回答
一个只适用于整型的解决方案(它接受浮点数,但舍入行为就像小数组件不存在一样),但不像任何依赖于临时转换到浮点数的解决方案(所有math.floor/math.浮点数)。基于天花板的解决方案,所有的解决方案使用/,大多数解决方案使用round),它适用于任意巨大的int输入,永远不会失去精度,永远不会引发异常或导致无穷大的值。
它是一个最简单的解决方案的改编,四舍五入到一个数字的下一个低倍数:
def round_to_nearest(num, base=5):
num += base // 2
return num - (num % base)
它所基于的四舍五入食谱是:
def round_down(num, base=5):
return num - (num % base)
唯一的变化是你提前给数字加上一半的基数,所以它四舍五入到最接近的值。对于精确的中点值,只有偶数底数才可能,因此round_to_nearest(3,6)将舍入为6而不是0,而round_to_nearest(- 3,6)将舍入为0而不是-6。如果希望中点值向下舍入,可以将第一行更改为num += (base - 1) // 2。
其他回答
舍入到非整数值,例如0.05:
def myround(x, prec=2, base=.05):
return round(base * round(float(x)/base),prec)
我发现这很有用,因为我只需要在代码中进行搜索和替换,就可以将“round(”更改为“myround(”,而不必更改参数值。
对不起,我想对阿洛克辛格海的回答发表评论,但由于缺乏声誉,它不让我评论=/
总之,我们可以再归纳一步:
def myround(x, base=5):
return base * round(float(x) / base)
这允许我们使用非整数进制,如。25或任何其他分数进制。
def round_to_next5(n):
return n + (5 - n) % 5
对已接受答案的补充,用于指定四舍五入到最接近的5或其他值
import math
def my_round(x, base, down = True):
return base * math.floor(x/base) + (not down) * base
我需要四舍五入到前面的5。
举个例子,16发到15发或者19发到15发
下面是使用的代码
def myround(x,segment):
preRound = x / segment
roundNum = int(preRound)
segVal = segment * roundNum
return segVal