你正在做157/32,它将两个整数相互分割,这总是产生一个向下舍入的整数。因此,(int)Math.ceil(…)没有做任何事情。有三种可能的解决方案来实现你想要的。我建议使用选项1或选项2.请不要使用选项0。
选项0
将a和b转换为双精度,你可以使用除法和Math.ceil,因为你希望它工作。然而,我强烈反对使用这种方法,因为双重划分可能不精确。
int n = (int) Math.ceil((double) a / b));
选项1
int n = a / b + (a % b == 0) ? 0 : 1;
如果a和b都是整数,则a / b与总是floor。然后你有一个内联if语句女巫检查你是否应该ceil而不是floor。所以1或0,如果有除法的余数你需要1. a%b == 0检查余数。
选项2
这个选项非常短,但也许有些不太直观。我认为这种不太直观的方法将比双分法和比较方法更快:
int n = (a + b - 1) / b;
为了减少溢出的可能性,您可以使用以下。然而,请注意,它不适用于a = 0和b> 1。
int n = (a - 1) / b + 1;
“较不直观的方法”
因为在Java(和大多数其他编程语言)中划分两个整数将总是使结果最小化。所以:
int a, b;
int result = a/b (is the same as floor(a/b) )
但我们不想要floor(a / b),而是ceil(a / b),并使用Wikipedia的定义和图:
有了这些地板和ceil功能的地块,你可以看到的关系。
您可以看到floor(x)<= ceil(x)。我们需要floor(x s)= ceil(x)。所以我们需要找到s。如果我们取1/2 <= s < 1它将是正确的(尝试一些数字,你会看到它,我发现很难自己证明这一点)。和1/2 <=(b-1)/ b < 1,所以
ceil(a/b) = floor(a/b + s)
= floor(a/b + (b-1)/b)
= floor( (a+b-1)/b) )
这不是一个真正的证明,但我希望你对它满意。如果有人能更好地解释它,我也很感激。也许在MathOverflow问。