如何将一个数字向上取整?

781
如何在Python中将数字向上取整?
我尝试使用round(number)函数,但它会将数字向下取整。以下是一个示例:
round(2.3) = 2.0 

而不是 3,这正是我想要的。

然后我尝试了int(number + .5),但它再次将数字舍入到下一个整数!例如:

int(2.3 + .5) = 2

13
如果数字是整数,round(number + .5) 就不起作用。例如 round(3+.5) == 4,但你实际上想要的是 3。请使用其他方法来实现四舍五入功能。 - Nearoo
30个回答

11

试一下这个:

a = 211.0
print(int(a) + ((int(a) - a) != 0))

2
聪明。当a需要向上取整时,表达式((int(a) - a) != 0)返回1。您可能希望扩展您的答案并解释这是如何工作的。 - Tom Aranda
@TomAranda 有人能解释一下布尔表达式如何求值吗? - Bowen Liu

9

如果有人想要将数字保留到特定的小数位:

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier

7

确保四舍五入的值应该是浮点数。

a = 8 
b = 21
print math.ceil(a / b)
>>> 0

但是
print math.ceil(float(a) / b)
>>> 1.0

7

以上答案是正确的,然而,仅为这个函数导入math模块通常会感觉有点过度。幸运的是,还有另一种方法:

g = 7/5
g = int(g) + (not g.is_integer())

TrueFalse在Python中被解释为包含数字的语句中的10g.is_interger()基本上等同于g.has_no_decimal()g == int(g)。因此,最后一条英文声明可表示为如果g有小数,请将g向下舍入并加1。


2
如果你感觉有趣的话,可以使用int(g) + (g % 1 > 0)代替;-) - Nearoo
似乎from math import ceil可以解决导入整个math模块的问题 :) - SH7890
1
@SH7890,恐怕这一行代码和“import math”在背后发生的事情上并没有太大的区别。它只是将除了ceil以外的所有符号都删除了。 - Nearoo

6

在不引入数学模块的基础环境下:

a) 方法/类方法

def ceil(fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

def ceil(self, fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

b) lambda:

ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)

6

x * -1 // 1 * -1

虽然有些混乱,但它是可行的:对于 x=7.1,得到 8.0。对于 x=-1.1,得到 -1.0

无需导入模块。


不错,但它背后的逻辑是什么? - Chadee Fouad
2
x * -1 // 1 * -1 = -(-x // 1)。 // 运算符总是向下取整,因此 x // 1 = floor(x)。 因此,这里的逻辑是将负数舍入到下一个整数,然后再次取反,从而得到原始数字的上舍入值。 - Alexander

5
>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

这个函数不需要任何模块。


7
如果你的数字是 3,那么它会四舍五入为 4,但这可能并不是某些人想要的。 - buydadip

2

对于那些不想使用import的人。

对于给定的列表或任何数字:

x = [2, 2.1, 2.5, 3, 3.1, 3.5, 2.499,2.4999999999, 3.4999999,3.99999999999]

首先,您需要判断该数字是否等于其整数值。整数值是向下取整的结果。如果结果为True,则返回该数字;否则,返回整数值(number) + 1。

w = lambda x: x if x == int(x) else int(x)+1
[w(i) for i in z]
>>> [2, 3, 3, 3, 4, 4, 3, 3, 4, 4]

数学逻辑:

  • 如果数字有小数部分:四舍五入 - 舍去 == 1,总是成立的。
  • 如果数字没有小数部分:四舍五入 - 舍去 == 0。

因此:

  • 四舍五入 == x + 舍去

其中:

  • 如果数字 != 舍去,则 x == 1
  • 如果数字 == 舍去,则 x == 0

你需要将数字分为整数和小数两部分。如果小数部分不为0,则加1。

注:我详细解释了这个问题,因为之前一些评论要求如此,而我还是一个新手,所以无法发表评论。


1
如果您不想导入任何内容,您可以随时编写自己的简单函数如下所示:
def RoundUP(num):
    if num== int(num):
        return num
    return int(num + 1)

4
如果num为2.05,则这种方法行不通。您必须输入至少与9相同数量的数字,留下0.999...,它等于1。但是,您的特殊情况2再次向上舍入。-- 嗯,我想数学库中有math.ceil函数也是有原因的。 - Johannes Maria Frank

0

我知道这是相当久以前的事情了,但我找到了一个非常有趣的答案,所以在这里分享:

-round(-x-0.5)

这个修复了边缘情况,并且适用于正数和负数,不需要任何函数导入。
干杯。

2
这个公式仍然会向下取整:-round(-x-0.3) = x - Diblo Dk
还会错误地增加精确数字。例如,-round(-3-0.5)返回的是4而不是应该的3。 - Jonah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接