核心概念
在 Java 中,int 和 double 都是基本数据类型(primitive types),而 Integer 和 Double 是它们对应的包装类(Wrapper Classes)。

- 基本类型转换:
int->double - 包装类转换:
Integer->Double
由于 Java 的自动装箱(Autoboxing)和拆箱(Unboxing)机制,在很多情况下,这两种转换可以无缝衔接。
直接赋值(最简单、最常用)
这是最直接的方法,因为 double 的数据范围和精度都大于 int,Java 允许直接将 int 类型的值赋给 double 类型的变量,这个过程叫做 widening primitive conversion (扩展基本类型转换),是隐式自动完成的。
原始类型 int 到 double
int myInt = 100;
double myDouble = myInt; // 隐式转换,自动将 int 提升为 double
System.out.println("原始 int 值: " + myInt); // 输出: 原始 int 值: 100
System.out.println("转换后的 double 值: " + myDouble); // 输出: 转换后的 double 值: 100.0
System.out.println("数据类型: " + ((Object)myDouble).getClass().getSimpleName()); // 输出: 数据类型: Double
说明:
100(int) 被自动转换为0(double)。- 这个过程是自动的,你不需要做任何额外操作。
包装类 Integer 到 Double
利用 Java 的自动拆箱和自动装箱机制,这个转换同样非常简单。

Integer myInteger = 250;
// 步骤分解:
// 1. myInteger (Integer) 被自动拆箱为 int 值 250。
// 2. int 值 250 被自动转换为 double 值 250.0。
// 3. double 值 250.0 被自动装箱为 Double 对象 250.0。
Double myDouble = myInteger;
System.out.println("原始 Integer 值: " + myInteger); // 输出: 原始 Integer 值: 250
System.out.println("转换后的 Double 值: " + myDouble); // 输出: 转换后的 Double 值: 250.0
System.out.println("数据类型: " + myDouble.getClass().getSimpleName()); // 输出: 数据类型: Double
说明:
- 这种方式代码简洁,可读性高,是日常开发中推荐的做法。
使用构造函数
Double 类的构造函数可以接受一个 double 类型的参数,我们可以先将 int 转换为 double,再用来创建 Double 对象。
int myInt = 123;
// 1. 先将 int 转换为 double
double primitiveDouble = (double) myInt; // 显式转换,虽然隐式也可以,但这样更清晰
// 2. 再用 double 值创建 Double 对象
Double myDouble = new Double(primitiveDouble);
// 或者写成一行(利用自动转换)
// Double myDouble = new Double(myInt);
System.out.println("使用构造函数转换: " + myDouble); // 输出: 使用构造函数转换: 123.0
说明:
- 这种方法略显冗长,因为直接赋值已经足够。
- 在现代 Java (Java 5+) 中,由于自动装箱的存在,直接赋值 (
Double myDouble = myInt;) 更为常用和简洁。
使用 doubleValue() 方法
Number 类是 Integer、Double、Long 等所有数字包装类的父类,它提供了一个 doubleValue() 方法,可以将任何 Number 子类对象转换为 double 类型。

这是一个非常通用的方法,特别是当你处理一个可能是多种数字类型的对象时。
Integer myInteger = 789;
Double myDouble = myInteger.doubleValue();
System.out.println("使用 doubleValue() 转换: " + myDouble); // 输出: 使用 doubleValue() 转换: 789.0
优点:
- 通用性强:如果变量
number的类型可能是Integer、Long或Float,你都可以用number.doubleValue()来统一获取其double表示,而无需关心其具体子类型。
Number number = 1000L; // 可以是 Long
Double myDouble = number.doubleValue(); // 通用方法,无需判断类型
System.out.println("通用转换: " + myDouble); // 输出: 通用转换: 1000.0
使用 Double.parseDouble() (仅适用于字符串)
如果你的 Integer 值是以 String 形式存在的,你可以先将 String 转为 int,再转为 double,但更直接的是,Double.parseDouble() 可以直接将表示数字的 String 转换为 double。
注意:这个方法不直接接受 Integer 对象,而是接受 String。
String intAsString = "2025";
// 方法 A: 先转 Integer,再转 Double
Integer myInt = Integer.parseInt(intAsString);
Double myDouble1 = myInt.doubleValue();
// 方法 B: 直接使用 Double.parseDouble (更简洁)
double primitiveDouble = Double.parseDouble(intAsString);
Double myDouble2 = primitiveDouble; // 自动装箱
System.out.println("通过 String 转换 (方法A): " + myDouble1); // 输出: 通过 String 转换 (方法A): 2025.0
System.out.println("通过 String 转换 (方法B): " + myDouble2); // 输出: 通过 String 转换 (方法B): 2025.0
总结与推荐
| 方法 | 适用场景 | 代码示例 | 优点 | 缺点 |
|---|---|---|---|---|
| 直接赋值 | 最常用。int/Integer 到 double/Double 的标准转换。 |
double d = 10;Double D = 10; |
简洁、易读、自动完成。 | 无明显缺点。 |
| 构造函数 | 创建新的 Double 对象。 |
Double D = new Double(10); |
概念明确。 | 代码冗长,不如直接赋值简洁。 |
doubleValue() |
当处理通用的 Number 对象时,需要获取其 double 值。 |
double d = myNumber.doubleValue(); |
通用性强,适用于所有 Number 子类。 |
对于已知的 Integer 到 Double 转换略显多余。 |
parseDouble() |
当输入是 String 类型时。 |
double d = Double.parseDouble("10"); |
专门用于字符串转换。 | 不直接适用于 int 或 Integer 类型。 |
最终建议
-
对于
int到double的原始类型转换:直接赋值即可。int i = 5; double d = i; // 推荐
-
对于
Integer到Double的包装类转换:直接赋值是最佳选择,因为它利用了自动拆箱和装箱,代码最清晰。Integer I = 5; Double D = I; // 推荐
-
如果你正在处理一个可能是多种数字类型的
Number对象:使用doubleValue()方法。Number number = ...; // 可能是 Integer, Long, Float 等 double d = number.doubleValue(); // 推荐
