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

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个回答

0

在不导入任何模块的情况下实现它:

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3

0
我很惊讶还没有看到这个答案 round(x + 0.4999),所以我要写下来。请注意,这适用于任何Python版本。对Python舍入方案所做的更改使事情变得困难。请参阅此post
不导入任何内容,我使用:
def roundUp(num):
    return round(num + 0.49)

testCases = list(x*0.1 for x in range(0, 50))

print(testCases)
for test in testCases:
    print("{:5.2f}  -> {:5.2f}".format(test, roundUp(test)))

为什么这样做是有效的

从文档中可以得知:

对于支持round()的内置类型,值将四舍五入到最接近10的负n次幂的倍数;如果两个倍数距离相等,则向偶数选择进行舍入。

因此,2.5会被四舍五入为2,3.5会被四舍五入为4。如果不是这种情况,那么可以通过添加0.5来进行四舍五入,但我们要避免达到一半的点。因此,如果您添加0.4999,您将会接近目标,但有足够的余地以便按照您通常所期望的进行四舍五入。当然,如果 x + 0.4999 等于 [n].5000,那么这种方法就会失败,但这种情况是不太可能发生的。


3
使用0.4999,它将无法为任何在???.0000和???.0001(开区间)之间的输入给出正确的结果,而不仅仅是确切的???.0001。例如,如果您尝试使用3.00005进行计算,则会得到3而不是预期的4。当然,您可以通过增加更多位数来减少这种情况发生的可能性,直到浮点数的最大精度,但如果有更健壮且直观的解决方案可用,例如使用math.ceil(),那么这样做的意义何在呢? - blubberdiblub
@blubberdiblub 在我的回答中,我说“不导入我使用:”。我还提到,如果 x + 0.4999 等于 [n].5000,它将失败。 - Klik
4
是的,您在答案中提到您的解决方案没有导入任何内容,但我并不认为它有价值。math模块和math.ceil()函数都在标准库中,因此在所有实际目的下都可以无需安装额外的内容而随处可用。关于您提到的失败情况,在您的答案中这部分是不完整的,因为它会在一整个区间内失败,而不仅仅是一个点。严格来说,您可以说您是正确的,因为您使用了“如果”而不是“当且仅当”,但对于普通读者来说,这会给人留下比实际情况更少的可能性印象。 - blubberdiblub

0
你可以这样使用 round:
cost_per_person = round(150 / 2, 2)

  

当round()的第二个参数为零时,这应该能够运行。也就是说,round(x/y,0)。 - Richard Valenz

0

这里有一个非常简单明了的答案,基于使用默认的round()函数。

def round_up(arg):
    if arg > round(arg):
        return round(arg) + 1
    else:
        return round(arg)

它执行

1 to 1     -1 to -1     1.0 to 1    1.00000001 to 2    -1.00000001 to -1

-1

在Python中执行4500/1000操作时,默认情况下Python将结果视为整数,因此逻辑上结果为4: 4500/1000 = 4.5 --> int(4.5) = 4 而4的向上取整显然是4

使用4500/1000.0操作,结果将为4.5,而4.5的向上取整--> 5

在JavaScript中,执行4500/1000操作将返回浮点数,因为JavaScript只将结果视为“数字类型”并直接返回结果

祝你好运!


1
这只适用于Python 2.x。在Python 3中,使用单个/进行除法运算始终会得到一个浮点数,因此4500/1000始终为4.5。 - Nearoo

-1

您可以使用地板除法并加1。 2.3 // 2 + 1


2
请使用 ceil() 函数,而不要奇怪地执行相反的操作然后进行补偿。 - gdvalderrama
2
这样行不通。例如:from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2) - Carl Thomé

-2

这应该可以工作。

a=16
b= int(input("Please enter a number greater than 0 \n"))

if b==0:
    print ( "Wrong input")

elif a%b != 0:
    c=a/b
    d= int(c)+1
    print (c)
    print (d)
else:
    c=a/b
    d=c        
print (c)
print (d)

这个问题已经超过 13 年 了,有数十个现有的答案。你确定你的答案带来了新的东西吗?如果是,太好了!但请向我们解释一下。 - Chris

-3

我的分享

我已经测试了上述示例中给出的print(-(-101 // 5)) = 21

现在来进行向上舍入:

101 * 19% = 19.19

我不能使用**,所以我将乘法转换为除法:

(-(-101 //(1/0.19))) = 20

1
请解释一下你想要做什么? - python-coder12345

-3

我认为你混淆了int()round()之间的工作机制。

int()总是截断小数部分,如果给定一个浮点数;而round()2.5这种情况下,23都与2.5相等距离,Python会返回更远离0点的那个数字。

round(2.5) = 3
int(2.5) = 2

“Rounding up” 的意思是将例如 2.3 转换为 3,这在您的两个示例中都没有发生。 - Nearoo

-4

我基本上是Python的初学者,但如果你只是想将数字四舍五入而不是向下取整,为什么不这样做:

round(integer) + 1

2
这对于任何满足 2.5 < 整数 < 3 的整数 i 都不起作用。期望的向上取整后的值是 3,但您的表达式会将其转换为 4。 - Pranav Shukla
1
我认为你的意思是 round(integer + 0.5)。这是我经常做的事情。 - Klik

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