在Python中舍入到5(或其他数字)


162

是否有一个内置函数可以像下面这样四舍五入?

10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20

Answers:


304

我不知道Python中的标准函数,但这对我有用:

Python 2

def myround(x, base=5):
    return int(base * round(float(x)/base))

Python3

def myround(x, base=5):
    return base * round(x/base)

很容易看出上述原因。您要确保将数字除以5是一个正确四舍五入的整数。所以,我们首先做到这些(round(float(x)/5)这里float只需要在Python2),然后因为我们除以5,我们乘以5为好。最终转换为int是因为round()在Python 2中返回了浮点值。

我通过给它一个base参数(默认值为5)使该函数更通用。


3
如果仅是整数和四舍五入,那么您也可以这样做x // base * base
Tjorriemorrie 2016年

7
这是我多心,但我更喜欢使用floor()ceil(),而不是铸造:base * floor(x/base)
user666412

1
@ user666412,math.floor并且math.ceil不允许与自定义库一起使用,因此首选项无关紧要。
Acumenus

48

对于四舍五入为非整数值,例如0.05:

def myround(x, prec=2, base=.05):
  return round(base * round(float(x)/base),prec)

我发现这很有用,因为我可以进行搜索并替换代码,将“ round(”更改为“ myround(”),而不必更改参数值。


2
您可以使用:def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec) 也接受numpy数组。
saubhik

23

这只是扩展问题

>>> 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

14

删除“其余”将起作用:

rounded = int(val) - int(val) % 5

如果值是aready,则为整数:

rounded = val - val % 5

作为功​​能:

def roundint(value, base=5):
    return int(value) - int(value) % int(base)

我喜欢此答案四舍五入到最接近的分数值。即如果我只想要0.25的增量。
泽西豆


9

round(x [,n]):将值四舍五入为乘幂n的最接近10的倍数。所以如果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

1
+1是为了向我们展示,round()可以将舍入处理为1.0以外的其他倍数,包括更高的值。(不过请注意,移位方法不适用于浮点数,更不用说大多数程序员对它的可读性了。)
Peter Hansen

1
@Peter Hansen感谢您的+1。需要有一个int(x)才能使移位与浮点数一起使用。约定不是最易读的,我不会自己使用它,但我确实喜欢它的“纯度”,只涉及1而不是2或5。
pwdyson



4

用:

>>> 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

2

如果有人需要“财务四舍五入”(总是向上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(朝着
带零的关系最接近),
ROUND_HALF_EVEN(朝着带偶数的最接近偶数),
ROUND_HALF_UP(远离零)或
ROUND_UP(远离零)。
ROUND_05UP(如果四舍五入后的最后一位数字为零,则为零;否则为零)

默认情况下,Python使用ROUND_HALF_EVEN,因为它具有一些统计上的优势(四舍五入的结果没有偏差)。


2

对于整数和Python 3:

def divround_down(value, step):
    return value//step*step


def divround_up(value, step):
    return (value+step-1)//step*step

生产:

>>> [divround_down(x,5) for x in range(20)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15]
>>> [divround_up(x,5) for x in range(20)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20]


1

下一个5的倍数

考虑到51需要转换为55:

code here

mark = 51;
r = 100 - mark;
a = r%5;
new_mark = mark + a;

1

这是我的C代码。如果我理解正确,应该应该是这样。

#include <stdio.h>

int main(){
int number;

printf("Enter number: \n");
scanf("%d" , &number);

if(number%5 == 0)
    printf("It is multiple of 5\n");
else{
    while(number%5 != 0)
        number++;
  printf("%d\n",number);
  }
}

并且四舍五入到最接近的5的倍数,而不仅仅是四舍五入;

#include <stdio.h>

int main(){
int number;

printf("Enter number: \n");
scanf("%d" , &number);

if(number%5 == 0)
    printf("It is multiple of 5\n");
else{
    while(number%5 != 0)
        if (number%5 < 3)
            number--;
        else
        number++;
  printf("nearest multiple of 5 is: %d\n",number);
  }
}

1

另一种方法(没有显式乘法或除法运算符):

def rnd(x, b=5):
    return round(x + min(-(x % b), b - (x % b), key=abs))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.