如何向上取整至下一个整数?

9
什么是将两个整数相除并向上取整的正确方法?
int a = 3;
int b = 2;

a / b = ? //should give 2

Math.ceil() 是正确的方法吗?


或者你可以执行 (a+1)/b。 - Aakash
@AakashGoyal,那只适用于这种特定情况。那4/2或6/5怎么办? - John
你将得到相同的值,考虑输出将是整数。4/2 -> 5/2 -> 2,6/5 -> 7/5 -> 1。 - Aakash
@AakashGoyal: 在大多数情况下不起作用。(b = 1,或任何 b - (a % b) > 1 - njzk2
@Henry的答案是有效的,另一方面 - njzk2
哦,是的,你说得对...并不适用于所有情况,我的错。 - Aakash
4个回答

35

不,Math.ceil()本身无法解决问题,因为问题发生在之前。ab都是整数,所以将它们相除得到的是一个整数,该整数是实际结果的地板值。对于a = 3b = 2,结果为1。一个的上限也是一 - 因此您无法获得所需的结果。

您必须先修复您的除法。通过将操作数中的一个强制转换为浮点数,您可以获得所需的非整数结果。然后,您可以使用Math.ceil将其向上舍入。这段代码应该有效:

Math.ceil((double)a / b);

35
你可以使用以下表达式(假设a和b为正数):
(a+b-1)/b

4
这是我最喜欢的答案。 它适用于任何编程语言。 - Raymond Chenon
1
当a = Integer.Max_Value,b = 1234时,a + b将导致溢出,因此使用(a-1) / b + 1更好。 - 戚锦秀

5

Math.ceil方法的返回类型是double,而Math.round的返回类型是int。因此,如果你希望结果为整数,则应该使用Math.round方法;否则,Math.ceil方法也可以。

float x = 1654.9874f;     
System.out.println("Math.round(" + x + ")=" + Math.round(x));   
System.out.println("Math.ceil(" + x + ")=" + Math.ceil(x));

输出

Math.round(1654.9874)=1655

Math.ceil(1654.9874)=1655.0

3

两个整数相除会产生余数,这种操作也称为整数除法

3/2 = 1

要使用 ceil 函数,您需要进行一个非整数的除法运算。

您可以将其值声明为双精度浮点数(3.03d),或在除法运算之前进行类型转换:

((double) 3) / ((double) 2) = 1.5

这个双精度浮点数可以用于向上取整函数ceil。

Math.ceil(3.0 / 2.0) = 2.0;

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