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将是最受欢迎的解释。