在python中循环到5(或其他数字)
是否有一个内置的函数可以这样圆:
10 -> 10 12 -> 10 13 -> 15 14 -> 15 16 -> 15 18 -> 20
我不知道Python中的标准函数,但这对我有用:
def myround(x, base=5): return int(base * round(float(x)/base))
很容易看出为什么上述工作。 你想确保你的数字除以5是一个整数,正确舍入。 所以,我们首先要做的是( round(float(x)/5)
),然后我们除以5,我们也乘以5。 最后转换为int
是因为round()
在Python中返回一个浮点值。
我通过给它一个base
参数,使得函数更通用,默认为5。
舍入为非整数值,如0.05:
def myround(x, prec=2, base=.05): return round(base * round(float(x)/base),prec)
我发现这很有用,因为我可以做一个search,并在我的代码中更换“round(”到“myround(”,而不必更改参数值。
这只是一个缩放的问题
>>> a=[10,11,12,13,14,15,16,17,18,19,20] >>> for b in a: ... int(round(b/5.0)*5.0) ... 10 10 10 15 15 15 15 15 20 20 20
删除“rest”将工作:
rounded = int(val) - int(val) % 5
如果该值是一个整数:
rounded = val - val % 5
作为一个function:
def roundint(value, base=5): return int(value) - int(value) % int(base)
round(x [,n]):将值四舍五入为10的最接近的倍数,以减去n。 所以如果n是负数
def round5(x): return int(round(x*2, -1)) / 2
由于10 = 5 * 2,所以可以使用整数除法和乘法2,而不是浮点除法和乘法5.0。 不是那么重要,除非你喜欢转移
def round5(x): return int(round(x << 1, -1)) >> 1
修改版divround 🙂
def divround(value, step, barrage): result, rest = divmod(value, step) return result*step if rest < barrage else (result+1)*step
对不起,我想对Alok Singhai的回答发表评论,但不会因为缺乏声誉= /
无论如何,我们可以总结一下,走一步:
def myround(x, base=5): return base * round(float(x) / base)
这使我们可以使用非整数的基数,如.25
或任何其他分数基数。
我意识到我迟到了,但似乎没有提到这个解决scheme:
>>> from __future__ import division # This is only needed on Python 2 >>> 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)将始终向上四舍五入。
类似的例子,没有四舍五入的最接近的倍数,表明它也performance为一个不同的“基”的预期:
>>> 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 round_to_next5(n): return n + (5 - n) % 5
如果有人需要“金融四舍五入”(总是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(朝向Infinity),
ROUND_DOWN(朝零),
ROUND_FLOOR(朝向-Infinity),
ROUND_HALF_DOWN(最接近零的关系),
ROUND_HALF_EVEN(最接近最接近偶数的关系),
ROUND_HALF_UP(距离零距离最近),或者
ROUND_UP(远离零)。
ROUND_05UP(如果在舍入到零后的最后一位数字将为0或5,则为零;否则为零)
默认情况下,Python使用ROUND_HALF_EVEN,因为它有一些统计上的优势(舍入的结果没有偏见)。
那这个呢:
def divround(value, step): return divmod(value, step)[0] * step
** 5的下一个倍数**
考虑51需要转换为55
code here mark=51; r=100-mark; a=r%5; new_mark=mark+a;
你可以“欺骗” int()
四舍五入,而不是将你传递给int()
的数加0.5
。