Python 将整数向上取整到下一个百位

115 投票
11 回答
138456 浏览
提问于 2025-04-17 10:16

看起来这个问题应该已经被问过很多次了(开个玩笑=)不过我只找到了一些关于浮点数四舍五入的函数。我想知道怎么把一个整数向上取整,比如:130 -> 200

11 个回答

25

试试这个:

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

这是一个稍晚的回答,但有一个简单的解决方案,它结合了现有答案的优点:从 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
208

四舍五入通常是针对浮点数进行的,这里有三个基本的函数你应该了解: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

撰写回答