下面我将详细介绍这三种方法,并提供代码示例和最佳实践。

使用 Double.parseDouble(String s) - 推荐
这是最直接、最常用且性能最好的方法,它会尝试将字符串参数解析为 double 类型。
语法
public static double parseDouble(String s) throws NumberFormatException;
特点
- 静态方法:通过
Double类直接调用,无需创建Double对象。 - 返回值:返回一个
double基本数据类型。 - 异常处理:如果字符串不能被解析为有效的
double(为null、格式不正确、包含非数字字符等),它会抛出NumberFormatException异常。
代码示例
public class StringToDoubleExample {
public static void main(String[] args) {
// 1. 标准的数字字符串
String str1 = "123.456";
double d1 = Double.parseDouble(str1);
System.out.println("转换结果 1: " + d1); // 输出: 转换结果 1: 123.456
// 2. 包含科学计数法的字符串
String str2 = "1.23e4";
double d2 = Double.parseDouble(str2);
System.out.println("转换结果 2: " + d2); // 输出: 转换结果 2: 12300.0
// 3. 字符串前后有空格(会被自动忽略)
String str3 = " -78.90 ";
double d3 = Double.parseDouble(str3);
System.out.println("转换结果 3: " + d3); // 输出: 转换结果 3: -78.9
// 4. 整数字符串(可以转换)
String str4 = "100";
double d4 = Double.parseDouble(str4);
System.out.println("转换结果 4: " + d4); // 输出: 转换结果 4: 100.0
}
}
异常处理示例
在实际开发中,你必须处理可能出现的 NumberFormatException。
public class StringToDoubleWithErrorHandling {
public static void main(String[] args) {
String[] testStrings = {
"123.45",
"abc",
null,
"123.45.67",
" 12.3 ",
"1,000.50" // 千位分隔符,在Java中默认不被识别
};
for (String str : testStrings) {
try {
if (str == null) {
System.out.println("输入字符串为 null,无法转换。");
continue;
}
double value = Double.parseDouble(str);
System.out.printf("'%s' -> %f%n", str, value);
} catch (NumberFormatException e) {
System.out.printf("错误:无法将字符串 '%s' 转换为 double。%n", str);
}
}
}
}
输出:
'123.45' -> 123.450000
错误:无法将字符串 'abc' 转换为 double。
输入字符串为 null,无法转换。
错误:无法将字符串 '123.45.67' 转换为 double。
' 12.3 ' -> 12.300000
错误:无法将字符串 '1,000.50' 转换为 double。
使用 Double.valueOf(String s)
这个方法和方法一非常相似,但它返回的是一个 Double 对象(即 double 的包装类型)。

语法
public static Double valueOf(String s) throws NumberFormatException;
特点
- 静态方法:通过
Double类直接调用。 - 返回值:返回一个
Double对象(包装类型)。 - 异常处理:同样会在转换失败时抛出
NumberFormatException。
代码示例
public class StringToDoubleValueOfExample {
public static void main(String[] args) {
String str = "987.65";
// valueOf 返回的是 Double 对象
Double doubleObj = Double.valueOf(str);
// 可以直接使用对象,也可以通过 .doubleValue() 获取基本类型
System.out.println("Double 对象: " + doubleObj);
System.out.println("基本 double 值: " + doubleObj.doubleValue());
// 自动拆箱 (Unboxing) 示例
double d = Double.valueOf(str); // Java 会自动将 Double 对象拆箱为 double
System.out.println("自动拆箱后的值: " + d);
}
}
使用 Double 构造函数
你也可以通过 Double 类的构造函数来创建一个 Double 对象。
语法
public Double(String s) throws NumberFormatException;
特点
- 构造函数:需要创建
Double类的实例。 - 返回值:返回一个
Double对象(包装类型)。 - 异常处理:转换失败时抛出
NumberFormatException。
代码示例
public class StringToDoubleConstructorExample {
public static void main(String[] args) {
String str = "555.55";
// 使用构造函数创建 Double 对象
Double doubleObj = new Double(str);
System.out.println("通过构造函数创建的 Double 对象: " + doubleObj);
System.out.println("基本 double 值: " + doubleObj.doubleValue());
}
}
方法对比与最佳实践
| 特性 | Double.parseDouble() |
Double.valueOf() |
new Double() |
|---|---|---|---|
| 返回类型 | double (基本类型) |
Double (对象) |
Double (对象) |
| 性能 | 最高,直接转换,无对象创建开销 | 较高,但会创建对象 | 较高,会创建对象 |
| 主要用途 | 当你只需要 double 值进行计算时 |
当你需要 Double 对象(例如存入集合)时 |
不推荐,valueOf() 是更好的选择 |
| 是否过时 | 否 | 否 | 在 Java 9 中被标记为过时,因为不必要地创建了对象 |
-
首选
Double.parseDouble():- 当你的目标是获取一个
double基本数据类型用于后续的数学运算或逻辑判断时,这是最佳选择,因为它避免了不必要的对象创建,效率最高。
- 当你的目标是获取一个
-
使用
Double.valueOf():- 当你需要一个
Double对象时,要将转换后的值存入一个List<Double>或Map<String, Double>等泛型集合中。 - 在现代 Java 中,
valueOf()通常比构造函数更受青睐,并且它内部有缓存机制(对-128到127之间的整数),可以复用对象。
- 当你需要一个
-
避免使用
new Double():
(图片来源网络,侵删)- 由于在 Java 9 中已被标记为过时,
valueOf()能以更简洁的方式完成相同的工作,因此应该避免使用构造函数来创建Double对象。
- 由于在 Java 9 中已被标记为过时,
-
始终进行异常处理:
- 永远不要假设输入的字符串一定是有效的,始终将转换逻辑包裹在
try-catch (NumberFormatException e)块中,以增强程序的健壮性。
- 永远不要假设输入的字符串一定是有效的,始终将转换逻辑包裹在
特殊情况处理
处理千位分隔符 (如 "1,000.50")
Double.parseDouble() 不能 直接处理包含逗号()作为千位分隔符的字符串,你需要先将其移除。
String strWithComma = "1,000,500.75";
// 错误的做法,会抛出 NumberFormatException
// double d = Double.parseDouble(strWithComma);
// 正确的做法:先移除所有非数字、非小数点、非负号、非科学计数法字符
String cleanStr = strWithComma.replaceAll("[^0-9.eE-]", "");
double d = Double.parseDouble(cleanStr);
System.out.println("移除逗号后转换: " + d); // 输出: 移除逗号后转换: 1000500.75
处理 null 值
直接对 null 字符串调用 parseDouble() 会立即抛出 NullPointerException,最好在调用前进行判断。
String str = null;
if (str != null) {
try {
double d = Double.parseDouble(str);
System.out.println(d);
} catch (NumberFormatException e) {
System.out.println("格式错误");
}
} else {
System.out.println("输入字符串为 null");
} 