在 Java 中,将字符串(String)转换为 double 类型主要有以下几种方法,我会为你详细介绍,包括它们的用法、示例、注意事项以及如何处理异常。

使用 Double.parseDouble(String s) - 最常用
这是最直接、最常用的方法,它是一个静态方法,尝试将给定的字符串解析为 double 类型。
语法
public static double parseDouble(String s) throws NumberFormatException;
特点
- 如果字符串可以成功解析为
double,则返回对应的double值。 - 如果字符串不是有效的
double格式,会抛出NumberFormatException异常。
示例代码
public class StringToDoubleExample {
public static void main(String[] args) {
String str1 = "123.456";
String str2 = "-78.90";
String str3 = "3.141592653589793";
String str4 = "1.23e4"; // 科学计数法
String str5 = " 123.45 "; // 前后有空格
try {
double d1 = Double.parseDouble(str1);
System.out.println("转换结果: " + d1); // 输出: 123.456
double d2 = Double.parseDouble(str2);
System.out.println("转换结果: " + d2); // 输出: -78.9
double d3 = Double.parseDouble(str3);
System.out.println("转换结果: " + d3); // 输出: 3.141592653589793
double d4 = Double.parseDouble(str4);
System.out.println("转换结果: " + d4); // 输出: 12300.0
double d5 = Double.parseDouble(str5);
System.out.println("转换结果: " + d5); // 输出: 123.45
// 以下代码会抛出异常
String invalidStr = "abc123.45";
double d6 = Double.parseDouble(invalidStr);
System.out.println(d6);
} catch (NumberFormatException e) {
System.err.println("转换失败: 字符串格式不正确");
e.printStackTrace();
}
}
}
注意事项
- 字符串必须完全有效:字符串内容必须是一个合法的
double数值表示,它可以是:- 十进制数(如
45,-78.9) - 科学计数法(如
23e4,5E-10) - 包含前导和尾随空格(如
" 123.45 ")
- 十进制数(如
- 无效格式会抛出异常:如果字符串包含非数字字符(如
abc)、空字符串 或null,都会抛出NumberFormatException。 null处理:如果传入的字符串是null,同样会抛出NullPointerException。
使用 Double.valueOf(String s)
Double 类的 valueOf 方法也可以将字符串转换为 double,但它返回的是一个 Double 对象(即 double 的包装类型)。
语法
public static Double valueOf(String s) throws NumberFormatException;
特点
- 与
parseDouble一样,如果字符串格式无效,会抛出NumberFormatException。 - 返回的是一个
Double对象,而不是原始的double类型,如果需要double类型,需要进行自动拆箱(unboxing)。
示例代码
public class StringToDoubleValueOfExample {
public static void main(String[] args) {
String str = "123.456";
// valueOf 返回 Double 对象
Double doubleObj = Double.valueOf(str);
System.out.println("Double 对象: " + doubleObj);
// 自动拆箱为 double 原始类型
double d = doubleObj; // 或者 d = Double.valueOf(str);
System.out.println("double 原始类型: " + d);
// 直接使用
double d2 = Double.valueOf(str); // 自动拆箱
System.out.println("直接转换: " + d2);
}
}
与 parseDouble 的区别
| 方法 | 返回类型 | 用途 |
|---|---|---|
Double.parseDouble() |
double (原始类型) |
当你明确需要一个 double 值时使用,性能稍好(避免了对象的创建)。 |
Double.valueOf() |
Double (对象类型) |
当你需要一个 Double 对象时使用,例如在泛型集合(如 List<Double>)中。 |
使用 new Double(String s) (已过时)
在早期版本的 Java 中,可以通过 Double 的构造函数来创建一个 Double 对象。
语法
public Double(String s) throws NumberFormatException;
特点
- 已过时 (Deprecated):从 Java 9 开始,这个构造函数被标记为过时,官方文档建议使用
valueOf(String)方法,因为它可以利用缓存机制提高性能(对于频繁使用的值如-Infinity,Infinity,NaN等)。 - 功能与
valueOf相同:同样返回一个Double对象。
示例代码 (不推荐)
// 过时的用法,不推荐 String str = "123.456"; Double doubleObj = new Double(str); // 已过时 System.out.println(doubleObj);
使用 NumberFormat 类 (处理本地化格式)
如果你的字符串包含特定于本地(Locale)的数字格式(欧洲国家用逗号 作为小数点),Double.parseDouble 可能会失败,这时,可以使用 NumberFormat 类。

特点
- 可以解析特定于本地化的数字字符串。
- 需要先创建一个
NumberFormat实例,并设置正确的本地化环境。
示例代码 (解析欧洲格式的数字)
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class StringToDoubleLocaleExample {
public static void main(String[] args) {
// 欧洲格式,逗号作为小数点
String europeanNumber = "123,45";
Locale germanLocale = Locale.GERMANY; // 德国使用逗号作为小数点
try {
NumberFormat germanFormat = NumberFormat.getInstance(germanLocale);
Number number = germanFormat.parse(europeanNumber);
double d = number.doubleValue();
System.out.println("转换结果: " + d); // 输出: 123.45
} catch (ParseException e) {
System.err.println("解析失败: " + e.getMessage());
}
}
}
处理异常和 null 值
在实际开发中,处理无效输入和 null 是非常重要的。
示例:封装一个安全的转换方法
public class SafeConverter {
/**
* 将字符串安全地转换为 double,如果转换失败则返回默认值。
* @param str 要转换的字符串
* @param defaultValue 转换失败时的默认值
* @return 转换后的 double 值,或默认值
*/
public static String toDouble(String str, double defaultValue) {
if (str == null || str.trim().isEmpty()) {
return String.valueOf(defaultValue); // 返回默认值的字符串形式
}
try {
return String.valueOf(Double.parseDouble(str.trim()));
} catch (NumberFormatException e) {
return String.valueOf(defaultValue);
}
}
public static void main(String[] args) {
String str1 = "123.45";
String str2 = "not a number";
String str3 = null;
String str4 = " -99.9 ";
System.out.println(toDouble(str1, 0.0)); // 输出: 123.45
System.out.println(toDouble(str2, 0.0)); // 输出: 0.0
System.out.println(toDouble(str3, -1.0)); // 输出: -1.0
System.out.println(toDouble(str4, 0.0)); // 输出: -99.9
}
}
总结与推荐
| 场景 | 推荐方法 | 原因 |
|---|---|---|
标准数字字符串 (如 "123.45") |
Double.parseDouble() |
最简单、最直接、性能最好。 |
需要 Double 对象 (如存入集合) |
Double.valueOf() |
返回对象,符合泛型要求,且性能良好。 |
本地化数字字符串 (如 "123,45") |
NumberFormat |
能正确处理不同地区的数字格式。 |
需要处理 null 或异常 |
try-catch + parseDouble |
提供健壮的错误处理机制。 |
| 旧代码维护 | new Double(String) |
不推荐,已过时,应使用 valueOf。 |
最佳实践建议:
- 除非有特殊需求(如处理本地化格式),否则优先使用
Double.parseDouble()。 - 始终将字符串转换操作放在
try-catch块中,以优雅地处理可能出现的NumberFormatException。 - 在转换前,可以先用
str.trim()去除字符串前后的空格,以避免不必要的异常。

