Java - 自定义整数除法函数

时间:2018-03-08 08:02:48

标签: java division modulus modular-arithmetic mod

我写了一段简单的代码 - 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;
}}

我无法理解这两者之间的区别? 可能是中间计算/运算符优先级导致此乱码。

4 个答案:

答案 0 :(得分:3)

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进行比较。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

所有/+%都有higher precedence而不是==,因此

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

相当于

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

所以你总是得到0或1。

答案 3 :(得分:1)

无论优先级问题如何,您的代码都会产生错误答案。

例如,public interface FooInterface { int getBar(); } 返回0,而ceil(-5, 3)返回-1(“un-ceiled”值为Math,ceil(-5.0 / 3.0))。

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

-1.666667

Ideone demo