Java - 自定义整数除法函数

Java - custom integer division function

我写了一段简单的代码——ceil1。由于重写相同代码后我的测试用例失败了 - ceil 有效。

public class Test {
public static void main(String args[]){
    System.out.println(ceil(3, 2)); //getting 2
    System.out.println(ceil1(3, 2)); //getting 1
}

public static int ceil(int dividend, int divisor){
    int a = dividend/divisor;
    int b = dividend%divisor == 0 ? 0:1;
    return a+b;
}

public static int ceil1(int dividend, int divisor){
    return dividend/divisor + dividend%divisor == 0 ? 0:1;
}}

我不知道这两者之间有什么区别? 可能是中间 calculation/operator 优先级导致了这种混乱。

return dividend/divisor + dividend%divisor == 0 ? 0:1;

增加

dividend/divisor + dividend%divisor

执行,然后将结果与0进行比较。

你想要:

return dividend/divisor + (dividend%divisor == 0 ? 0:1);

return dividend/divisor + (dividend%divisor == 0) ? 0:1;

为了仅将 dividend%divisor0 进行比较。

加法 (+) 运算符的优先级高于三元 (?) 运算符。您可以用括号括起该表达式以获得您想要的行为:

public static int ceil1(int dividend, int divisor){
    return dividend/divisor + (dividend%divisor == 0 ? 0:1);
}

所有 /+%higher precedence 都比 ==,因此

dividend/divisor + dividend%divisor == 0 ? 0:1

相当于

(dividend/divisor + dividend%divisor) == 0 ? 0:1

所以你总是会从中得到 0 或 1。

不管优先级问题如何,您的代码都会产生不正确的答案。

例如,ceil(-5, 3) returns 0,而 Math,ceil(-5.0 / 3.0) returns -1("un-ceiled" 值为 -1.666667)。

如果您使用更简单的方法,您将得到正确答案:

(dividend + divisor - 1) / divisor

Ideone demo