Python整数到下一百

似乎应该已经被问过数百次(双关都是好玩的),但我只能find四舍五入的function。 我如何四舍五入整数,例如: 130 -> 200

舍入通常是在浮点数上完成的,这里有三个你应该知道的基本函数: round (四舍五入到最接近的整数), math.floor (总是math.ceil )和math.ceil (总是四舍五入)。

你可以询问整数和四舍五入,但只要你的数字小于2 53 ,我们仍然可以使用math.ceil 。 要使用math.ceil ,我们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成千上万。 如果您想要舍入到数十( n = 1 ),数千( n = 3 )等,则可以使用10**n而不是100。

另一种方法是避免使用浮点数(精度有限),而只使用整数。 整数在Python中具有任意精度,所以这可以让你整理任何大小的数字。 四舍五入的规则很简单:find除以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 

我做了两个解决scheme的迷你基准:

 $ 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解相比,纯整数解更快math.ceil

托马斯提出了一个基于整数的解决scheme,这个解决scheme和我上面提到的解决scheme是一样的,除了它通过乘以布尔值来使用技巧。 有趣的是,这样写代码没有速度优势:

 $ 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到200,比如舍入到最接近的 100,那么内置的round函数可以为你做:

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

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

 def roundUpToMultiple(number, multiple): num = number + (multiple - 1) return num - (num % multiple) 

示例用法:

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

尝试这个:

 int(round(130 + 49, -2)) 

这是一个迟到的答案,但有一个简单的解决scheme,结合了现有答案的最好的方面:从x的下一个100倍数是x - x % -100 (或者如果您愿意, x + (-x) % 100 )。

 >>> x = 130 >>> x -= x % -100 # Round x up to next multiple of 100. >>> x 200 

如果x是一个浮点数(如Martin Geisler的答案),那么这是快速而简单的,给出了任何整数x正确结果(如John Machin的答案),并给出了合理的结果(以浮点表示法为例)。

 >>> x = 0.1 >>> x -= x % -100 >>> x 100.0 

对于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)] 

更新 当前接受的答案与整数分开,以使float(x)/ float(y)不能准确地表示为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__ 

输出:

 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 

这里有一些时机:

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

如果你的int是x: x + 100 - x % 100

但是,正如评论所指出的,如果x==100 ,将返回200。

如果这不是预期的行为,则可以使用x + 100*(x%100>0) - x%100

尝试这个:

 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 

示例用法:

 >>> ceilm(257,5) 260 >>> ceilm(260,5) 260 

警告:未成熟的优化

既然这么多的答案做这个时间我想增加另一个select。

以马丁·盖斯勒的名字命名

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

(我最喜欢几个原因)

但是把%行动分解出来

 def roundup2(x): x100= x % 100 return x if x100 == 0 else x + 100 - x100 

比原来的速度提高了20%

 def roundup3(x): x100 = x % 100 return x if not x100 else x + 100 - x100 

甚至更好,比原来快了36%

最后我想我可以放弃not操作员,改变分支机构的顺序,希望这样做也能提高速度,但却感到困惑,发现实际上速度比原来慢了23%。

 def roundup4(x): x100 = x % 100 return x + 100 - x100 if x100 else x >python -m timeit -s "x = 130" "x if x % 100 == 0 else x + 100 - x % 100" 1000000 loops, best of 3: 0.359 usec per loop >python -m timeit -s "x = 130" "x100 = x % 100" "x if x100 == 0 else x + 100 - x100" 1000000 loops, best of 3: 0.287 usec per loop >python -m timeit -s "x = 130" "x100 = x % 100" "x if not x100 else x + 100 - x100" 1000000 loops, best of 3: 0.23 usec per loop >python -m timeit -s "x = 130" "x100 = x % 100" "x + 100 - x100 if x100 else x" 1000000 loops, best of 3: 0.277 usec per loop 

关于为什么3更快然后4将是最受欢迎的解释。