HOWTO · Java

Java 中的整数除法

了解 Java 整数除法如何计算、余数如何获取,以及如何通过类型转换得到小数结果;同时掌握除以零和整数溢出的处理方法。

本页内容

Java 的整数除法会返回整数商,并向零截断。两个操作数都是 int 时,10 / 9 的结果是 1,而 10 / 19 的结果是 0;Java 不会对商进行四舍五入。使用 % 获取余数;如果需要小数结果,则应在相除前将至少一个操作数转换为 double。

整数除法基础

下面这个完整的 Java 程序会打印四组 int 数值相除后的商:

public class IntegerDivision {
    public static void main(String[] args) {
        int first = 10 / 9;
        int second = -10 / 9;
        int third = 10 / -9;
        int fourth = 10 / 19;

        System.out.println(first);
        System.out.println(second);
        System.out.println(third);
        System.out.println(fourth);
    }
}
1
-1
-1
0

两个操作数都不为零时,恰有一个操作数为负数,商就为负数。正商小于 1 时,例如 10 / 19,结果会变成 0;-10 / 19 也会变成 0,因为截断方向是朝向零。只要除数不为零,分子为零时商就是 0。

使用取模运算符处理余数

% 运算符会返回整数除法的余数。如果计算需要商和余数,可以同时使用 / 和 %。对于 Java 的有符号整数,余数的符号与被除数(左侧操作数)相同;余数也可能为零:

public class QuotientAndRemainder {
    public static void main(String[] args) {
        int dividend = -10;
        int divisor = 3;
        int quotient = dividend / divisor;
        int remainder = dividend % divisor;

        System.out.println("Quotient: " + quotient);
        System.out.println("Remainder: " + remainder);
    }
}
Quotient: -3
Remainder: -1

这些值满足 dividend == quotient * divisor + remainder:在本例中,-10 == (-3 * 3) + (-1)。例如,检查 number % 2 == 0 就可以判断一个整数是否为偶数。Java 的 % 常被称为取模运算符,不过遇到负数时,应留意它按有符号余数规则计算。

通过类型转换提高精度

若要得到小数商,必须在执行 / 之前将至少一个操作数转换为 float 或 double。类型转换会让这次运算改为浮点除法:

public class FloatingPointDivision {
    public static void main(String[] args) {
        int numerator = 5;
        int denominator = 2;
        double result = (double) numerator / denominator;

        System.out.println(result);
    }
}
2.5

转换发生在除法之前,因此 5 会按 double 处理,商也会保留小数部分。如果在除法之后才转换,例如 (double) (5 / 2),得到的只是把已经算出的整数 2 转成 2.0,无法恢复已舍弃的小数部分。float 和 double 的二进制精度有限,因此许多十进制小数只能近似表示。一般用途通常选择 double,并且不要依赖固定的小数位数显示结果。若需要精确的十进制运算,例如金额计算,应使用 BigDecimal,并明确设置小数位数和舍入规则。

整数除法中的常见问题

整数除数为零会导致 ArithmeticException。除法前应检查除数;如果不便检查,也可以在适当位置处理异常。例如:

public class SafeDivision {
    public static void main(String[] args) {
        int numerator = 10;
        int denominator = 0;

        if (denominator == 0) {
            System.out.println("Cannot divide by zero.");
        } else {
            System.out.println(numerator / denominator);
        }
    }
}
Cannot divide by zero.

当 denominator 来自输入或计算结果时,这项检查尤其有用。整数除以零会在赋值完成前抛出异常。浮点除法的规则不同:double 或 float 除以零会产生无穷大或 NaN,而不会抛出这种整数除法的 ArithmeticException。如果这些结果对应用程序没有意义,也应检查并处理。

另一个需要注意的问题是整数范围:Integer.MIN_VALUE / -1 会超出 int 的表示范围,结果为 Integer.MIN_VALUE。Java 不会因这次溢出而抛出异常。如果输入可能接近类型边界,请改用范围更大的类型,或在依赖商之前验证数值范围。

总结

在 Java 中,整数除法的 / 会向零截断,% 会给出带符号的余数。相除前转换一个操作数即可得到浮点商;对整数除法则应防止除数为零。

常见问题

int 除以零会怎样?
Java 会抛出 ArithmeticException。请先检查除数,或处理该异常。

怎样得到小数结果?
在使用 / 之前,先将至少一个操作数转换为 double 或 float。

怎样获取余数?
使用 %,例如 int remainder = dividend % divisor;。

可以在循环中使用整数除法吗?
可以。请记住,每次整数除法都会向零截断;如果循环计算需要小数,应使用浮点操作数。