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