代码之家  ›  专栏  ›  技术社区  ›  Djangonaut

在python中四舍五入到5(或其他数字)

  •  130
  • Djangonaut  · 技术社区  · 14 年前

    是否有一个内置函数可以像下面那样循环?

    10 -> 10
    12 -> 10
    13 -> 15
    14 -> 15
    16 -> 15
    18 -> 20
    
    13 回复  |  直到 6 年前
        1
  •  238
  •   Alok Singhal    14 年前

    我不知道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。

        2
  •  37
  •   CCKx    11 年前

    对于舍入到非整数值,如0.05:

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

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

        3
  •  19
  •   amo-ej1    14 年前

    这只是一个比例问题

    >>> 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
    
        4
  •  11
  •   hgdeoro    12 年前

    移除“其余部分”会起作用:

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

    如果该值是一个整数:

    rounded = val - val % 5
    

    作为一个函数:

    def roundint(value, base=5):
        return int(value) - int(value) % int(base)
    
        5
  •  7
  •   Andy Wong    8 年前
    def round_to_next5(n):
        return n + (5 - n) % 5
    
        6
  •  6
  •   pwdyson    14 年前

    四舍五入(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
    
        7
  •  4
  •   Seth    10 年前

    对不起,我想对阿洛克·辛海的回答发表评论,但由于名声不好,我不能接受。=/

    不管怎样,我们可以概括一个步骤,然后继续:

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

    这允许我们使用非整数基,比如 .25 或任何其他分数基。

        8
  •  3
  •   Christian Hausknecht    14 年前

    DivRound的修改版本:—)

    def divround(value, step, barrage):
        result, rest = divmod(value, step)
        return result*step if rest < barrage else (result+1)*step
    
        9
  •  2
  •   Peter Mortensen sifr_dot_in    6 年前

    用途:

    >>> 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)将始终向上舍入。

    一个类似的例子,它四舍五入到最接近的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
    
        10
  •  1
  •   Piotr Siejda    7 年前

    如果有人需要“财务四舍五入”(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'))))
    

    根据文件,其他舍入选项包括:

    圆形天花板(朝向无穷大)
    四舍五入(接近零)
    圆形地板(朝向-无穷大)
    四舍五入(到最接近的,领带朝向零)。
    四舍五入偶数
    四舍五入(到最近的,领带从零开始),或
    四舍五入(从零开始)。
    向上取整(如果向零取整后的最后一个数字为0或5,则从零开始;否则,从零开始)

    默认情况下,python使用round_half_,尽管它有一些统计优势(rounded结果没有偏向)。

        11
  •  0
  •   Christian Hausknecht    14 年前

    这个怎么样:

     def divround(value, step):
         return divmod(value, step)[0] * step
    
        12
  •  -2
  •   Peter Mortensen sifr_dot_in    6 年前

    5的下一个倍数

    考虑到51需要转换为55:

    code here
    
    mark = 51;
    r = 100 - mark;
    a = r%5;
    new_mark = mark + a;
    
        13
  •  -3
  •   Uri Agassi    10 年前

    你可以耍花招 int() 四舍五入而不是通过添加 0.5 到 你传给的号码 in() .