Python将整数舍入到下一百

ofk*_*fko 71 python math rounding

似乎应该已经被问过几百次(双关语很有趣),但我只能找到圆形浮子的功能.如何舍入整数,例如:130 -> 200

Mar*_*ler 123

舍入通常在浮点数上完成,这里有三个基本函数你应该知道:(舍入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
Run Code Online (Sandbox Code Playgroud)

首先除以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
Run Code Online (Sandbox Code Playgroud)

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

>>> roundup(100)
100
>>> roundup(130)
200
>>> roundup(1234567891234567891)
1234567891234567900L
Run Code Online (Sandbox Code Playgroud)

我做了两个解决方案的迷你基准测试:

$ 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
Run Code Online (Sandbox Code Playgroud)

math.ceil解决方案相比,纯整数解决方案快两倍.

托马斯提出了一个基于整数的解决方案,它与我上面的解决方案相同,只不过它通过乘以布尔值来使用技巧.有趣的是,以这种方式编写代码没有速度优势:

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

作为最后一点,我还要注意,如果你想要将101-149轮到100轮并将轮150-199轮到200轮,例如,舍入到最接近的百度,那么内置round函数可以为你做到:

>>> int(round(130, -2))
100
>>> int(round(170, -2))
200
Run Code Online (Sandbox Code Playgroud)

  • @ofko:对,你要整理一下.`math.ceil`是规范的方法 - 除以100乘以规则的方法使`round`,`ceil`和`floor`工作数百. (3认同)
  • -1这种方法对于浮点数可能是"规范的",但是**失败**有大整数.详情请见我的回答.OP专门要求整数,并且没有表示数字大小的上限. (2认同)

Fre*_*Foo 20

试试这个:

int(round(130 + 49, -2))
Run Code Online (Sandbox Code Playgroud)

  • 但这并不总是四舍五入,这就是问题所问的。 (3认同)

Mar*_*son 20

这是一个迟到的回答,但有它结合了现有的答案最好的方面的简单解决方案:的下一个倍数100最多的xx - x % -100(或者,如果你喜欢,x + (-x) % 100).

>>> x = 130
>>> x -= x % -100  # Round x up to next multiple of 100.
>>> x
200
Run Code Online (Sandbox Code Playgroud)

这是快速而简单的,为任何整数提供正确的结果x(如John Machin的答案),并且如果x是浮点数(如Martin Geisler的答案),也给出了合理的结果(以浮点表示的常见警告为模).

>>> x = 0.1
>>> x -= x % -100
>>> x
100.0
Run Code Online (Sandbox Code Playgroud)

  • 注意:若要始终向下舍入,则为``x -= x % +100``` (3认同)
  • 您的解决方案与马丁的解决方案一样快,但符号更短。谢谢。%timeit 'x = 110' 'x -= x % -100' # 100000000 次循环,3 次最佳:每次循环 9.37 ns VS %timeit 'x = 110' 'x + 100*(x%100>0) - x %100' #100000000 个循环,3 个中最好的:每个循环 9.38 ns (2认同)

Luk*_*ard 17

这是一种舍入到任何正整数的最接近倍数的一般方法:

def roundUpToMultiple(number, multiple):
    num = number + (multiple - 1)
    return num - (num % multiple)
Run Code Online (Sandbox Code Playgroud)

样品用法:

>>> roundUpToMultiple(101, 100)
200
>>> roundUpToMultiple(654, 321)
963


Joh*_*hin 9

对于a非负,b正,两个整数:

>>> rup = lambda a, b: (a + b - 1) // b * b
>>> [(x, rup(x, 100)) for x in (199, 200, 201)]
[(199, 200), (200, 200), (201, 300)]
Run Code Online (Sandbox Code Playgroud)

更新 当前接受的答案与整数分开,因此float(x)/ float(y)无法准确表示为a float.看到这段代码:

import math

def geisler(x, y): return int(math.ceil(x / float(y))) * y

def orozco(x, y): return x + y * (x % y > 0) - x % y

def machin(x, y): return (x + y - 1) // y * y

for m, n in (
    (123456789123456789, 100),
    (1234567891234567891, 100),
    (12345678912345678912, 100),
    ):
    print; print m, "m"; print n, "n"
    for func in (geissler, orozco, machin):
        print func(m, n), func.__name__
Run Code Online (Sandbox Code Playgroud)

输出:

123456789123456789 m
100 n
123456789123456800 geisler
123456789123456800 orozco
123456789123456800 machin

1234567891234567891 m
100 n
1234567891234568000 geisler <<<=== wrong
1234567891234567900 orozco
1234567891234567900 machin

12345678912345678912 m
100 n
12345678912345680000 geisler <<<=== wrong
12345678912345679000 orozco
12345678912345679000 machin
Run Code Online (Sandbox Code Playgroud)

以下是一些时间安排:

>\python27\python -m timeit -s "import math;x =130" "int(math.ceil(x/100.0))*100"
1000000 loops, best of 3: 0.342 usec per loop

>\python27\python -m timeit -s "x = 130" "x + 100 * (x % 100 > 0) - x % 100"
10000000 loops, best of 3: 0.151 usec per loop

>\python27\python -m timeit -s "x = 100" "(x + 99) // 100 * 100"
10000000 loops, best of 3: 0.0903 usec per loop
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试这个:

import math

def ceilm(number, multiple):
    '''Returns a float rounded up by a factor of the multiple specified'''
    return math.ceil(float(number)/multiple) * multiple
Run Code Online (Sandbox Code Playgroud)

使用示例:

>>> ceilm(257, 5)
260
>>> ceilm(260, 5)
260
Run Code Online (Sandbox Code Playgroud)