Python将整数舍入到下一百

发布于 2021-01-29 15:04:18

似乎应该已经被问过数百次了(双关很有趣=),但是我只能找到舍入浮点数的函数。如何围捕一个整数,例如:130 -> 200

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    四舍五入通常是对浮点数进行的,这里您应该知道三个基本函数:(round四舍五入到最接近的整数),math.floor(总是四舍五入)和math.ceil(总是四舍五入)。

    您询问整数并舍入到数百,但是math.ceil只要您的数字小于2
    53,我们仍然可以使用。要使用math.ceil,我们只需先除以100,向上舍入,然后再乘以100:

    >>> import math
    >>> def roundup(x):
    ...     return int(math.ceil(x / 100.0)) * 100
    ... 
    >>> roundup(100)
    100
    >>> roundup(101)
    200
    

    先除以100,然后再乘以100,然后将“小数点”向左和向右移动两位,这样就math.ceil可以处理数百个数字。10**n如果您想舍入到十(n = 1),数千(n = 3)等,可以使用而不是100 。

    执行此操作的另一种方法是避免浮点数(精度有限),而仅使用整数。整数在Python中具有任意精度,因此可以四舍五入任意大小的数字。四舍五入的规则很简单:除以100后找到余数,如果非零则加100减去此余数:

    >>> def roundup(x):
    ...     return x if x % 100 == 0 else x + 100 - x % 100
    

    这适用于任何大小的数字:

    >>> roundup(100)
    100
    >>> roundup(130)
    200
    >>> roundup(1234567891234567891)
    1234567891234567900L
    

    我对这两种解决方案做了一个迷你基准测试:

    $ python -m timeit -s 'import math' -s 'x = 130' 'int(math.ceil(x/100.0)) * 100'
    1000000 loops, best of 3: 0.364 usec per loop
    $ python -m timeit -s 'x = 130' 'x if x % 100 == 0 else x + 100 - x % 100'
    10000000 loops, best of 3: 0.162 usec per loop
    

    与该math.ceil解相比,纯整数解的速度快两倍。

    Thomas提出了一种基于整数的解决方案,该解决方案与我上面的解决方案完全相同,不同之处在于它通过将布尔值相乘来使用技巧。有趣的是,以这种方式编写代码没有速度优势:

    $ python -m timeit -s 'x = 130' 'x + 100*(x%100>0) - x%100'
    10000000 loops, best of 3: 0.167 usec per loop
    

    最后,请允许我注意一下,如果您想将101–149舍入到100,并将150–199舍入到200,例如,舍入到 最接近的
    百位,则内置round函数可以为您做到这一点:

    >>> int(round(130, -2))
    100
    >>> int(round(170, -2))
    200
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看