核心要点
在开始之前,请务必记住 double 和 int 的关键区别:

double:是浮点数类型,可以存储小数(5),它的范围比int大得多。int:是整数类型,只能存储整数(10),范围较小。
将 double 转为 int 必然会丢失小数部分,这个过程在 Java 中被称为截断,而不是四舍五入。
强制类型转换(Casting)
这是最直接、最常用的方法,使用一对圆括号 将目标类型 int 包裹起来,放在需要转换的 double 变量前面。
语法
int intValue = (int) doubleValue;
行为
直接丢弃小数部分,只保留整数部分,这被称为截断。
示例
public class DoubleToIntExample {
public static void main(String[] args) {
double positiveDouble = 99.89;
double negativeDouble = -99.89;
double doubleWithFraction = 50.0; // 小数部分为0
// 强制类型转换
int intFromPositive = (int) positiveDouble;
int intFromNegative = (int) negativeDouble;
int intFromWhole = (int) doubleWithFraction;
System.out.println("原始 double 值: " + positiveDouble);
System.out.println("强制转换后的 int 值: " + intFromPositive); // 输出 99
System.out.println("\n原始 double 值: " + negativeDouble);
System.out.println("强制转换后的 int 值: " + intFromNegative); // 输出 -99
System.out.println("\n原始 double 值: " + doubleWithFraction);
System.out.println("强制转换后的 int 值: " + intFromWhole); // 输出 50
}
}
输出结果:

原始 double 值: 99.89
强制转换后的 int 值: 99
原始 double 值: -99.89
强制转换后的 int 值: -99
原始 double 值: 50.0
强制转换后的 int 值: 50
注意: 即使 89 更接近 100,强制转换的结果仍然是 99,它不会进行四舍五入。
使用 Math 类的方法
如果你希望在转换前对小数部分进行四舍五入,可以使用 java.lang.Math 类中的方法。
Math.round()
这是最常用的方法,用于实现标准的“四舍五入”。
- 行为:将
double四舍五入到最接近的long整数值,然后你可以再将long赋值给int。 - 注意:
Math.round()的返回值是long类型,而不是int,因为double的范围可能超出int的范围,所以返回一个更大的类型long是更安全的。
语法
int intValue = (int) Math.round(doubleValue);
示例
public class MathRoundExample {
public static void main(String[] args) {
double d1 = 99.49; // 小数部分 < 0.5,应舍去
double d2 = 99.50; // 小数部分 >= 0.5,应进一
double d3 = -99.49; // 绝对值的小数部分 < 0.5,应舍去
double d4 = -99.50; // 绝对值的小数部分 >= 0.5,应舍去(向绝对值小的方向舍入)
// 使用 Math.round() 进行四舍五入
int i1 = (int) Math.round(d1);
int i2 = (int) Math.round(d2);
int i3 = (int) Math.round(d3);
int i4 = (int) Math.round(d4);
System.out.println("原始值: " + d1 + ", 四舍五入后: " + i1); // 输出 99
System.out.println("原始值: " + d2 + ", 四舍五入后: " + i2); // 输出 100
System.out.println("原始值: " + d3 + ", 四舍五入后: " + i3); // 输出 -99
System.out.println("原始值: " + d4 + ", 四舍五入后: " + i4); // 输出 -99 (注意:-99.5 四舍五入是 -99)
}
}
输出结果:

原始值: 99.49, 四舍五入后: 99
原始值: 99.5, 四舍五入后: 100
原始值: -99.49, 四舍五入后: -99
原始值: -99.5, 四舍五入后: -99
Math.floor() 和 Math.ceil()
这两个方法也常用于转换,但它们的行为更特殊。
Math.floor(double a):向下取整,返回小于或等于a的最大整数(以double形式返回)。Math.floor(99.9)->0Math.floor(-99.1)->-100.0(注意是向负无穷方向取整)
Math.ceil(double a):向上取整,返回大于或等于a的最小整数(以double形式返回)。Math.ceil(99.1)->0Math.ceil(-99.9)->-99.0(注意是向正无穷方向取整)
使用它们时也需要先转换为 double,然后再强制转换为 int。
double d = 99.9; int floorValue = (int) Math.floor(d); // 结果为 99 int ceilValue = (int) Math.ceil(d); // 结果为 100
总结与对比
| 方法 | 语法 | 行为 | 返回类型 | 适用场景 |
|---|---|---|---|---|
| 强制类型转换 | (int) myDouble |
截断:直接丢弃小数部分,只保留整数部分。 | int |
当你明确只想丢弃小数部分时,例如处理像素坐标、计算页数等。 |
Math.round() |
(int) Math.round(myDouble) |
四舍五入:将小数部分四舍五入到最接近的整数。 | long |
当你需要最标准的四舍五入运算时。这是最常见的四舍五入需求。 |
Math.floor() |
(int) Math.floor(myDouble) |
向下取整:向负无穷方向取整。 | double |
当你需要一个不大于原数的最大整数时,例如计算商品价格的下限。 |
Math.ceil() |
(int) Math.ceil(myDouble) |
向上取整:向正无穷方向取整。 | double |
当你需要一个不小于原数的最小整数时,例如计算需要多少个箱子来装东西。 |
重要注意事项
-
数据范围溢出:
double的数值范围远大于int,如果一个double值超出了int的表示范围(0e30),强制转换为int会导致一个不明确的、不可预测的结果,而不是抛出异常,在进行转换前,最好先检查数值是否在int的范围内。double largeDouble = 1.0e20; // 10的20次方 int result = (int) largeDouble; // 结果是 2147483647 (Integer.MAX_VALUE),发生了溢出 System.out.println(result);
-
NaN和Infinity:double值是NaN(Not a Number),强制转换为int的结果是0。double值是POSITIVE_INFINITY或NEGATIVE_INFINITY,强制转换为int的结果是Integer.MAX_VALUE或Integer.MIN_VALUE。
最佳实践
- 如果只想丢弃小数部分:使用 强制类型转换
(int),它最高效且意图明确。 - 如果需要进行四舍五入:使用
Math.round(),这是最标准、最不容易出错的做法。 - 在转换前检查数值范围:如果处理的
double值可能非常大,请务必检查它是否在Integer.MIN_VALUE和Integer.MAX_VALUE之间,以避免潜在的溢出问题。
