Python 将整数向上取整到下一个百位
看起来这个问题应该已经被问过很多次了(开个玩笑=)不过我只找到了一些关于浮点数四舍五入的函数。我想知道怎么把一个整数向上取整,比如:130 -> 200
?
11 个回答
试试这个:
int(round(130 + 49, -2))
这是一个稍晚的回答,但有一个简单的解决方案,它结合了现有答案的优点:从 x
开始,向上找下一个 100
的倍数,可以用 x - x % -100
来表示(或者如果你喜欢的话,也可以用 x + (-x) % 100
)。
>>> x = 130
>>> x -= x % -100 # Round x up to next multiple of 100.
>>> x
200
这个方法既快速又简单,对于任何整数 x
都能给出正确的结果(就像约翰·马钦的回答一样),而且如果 x
是浮点数的话(就像马丁·盖斯勒的回答),也能给出相对合理的结果(当然要考虑浮点数表示的一些常见问题)。
>>> x = 0.1
>>> x -= x % -100
>>> x
100.0
四舍五入通常是针对浮点数进行的,这里有三个基本的函数你应该了解:round
(四舍五入到最接近的整数)、math.floor
(总是向下取整)和math.ceil
(总是向上取整)。
你问到整数和向上取整到百位,但只要你的数字小于253,我们仍然可以使用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中可以表示任意大小的数字,所以这让你可以对任何大小的数字进行取整。取整的规则很简单:先用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