使用 Double.parseDouble() (推荐)
这是最常用、最直接的方法,它是一个静态方法,可以直接通过 Double 类调用。

(图片来源网络,侵删)
语法
public static double parseDouble(String s) throws NumberFormatException;
特点
- 返回值:一个
double基本数据类型。 - 异常:
String参数不能被解析为一个有效的double,它会抛出NumberFormatException异常,在使用时通常需要配合try-catch语句。
示例代码
public class StringToDoubleExample {
public static void main(String[] args) {
String str1 = "123.456";
String str2 = "-789.01";
String str3 = "3.1415926";
String str4 = "123"; // 整数字符串
String str5 = "abc"; // 非数字字符串
String str6 = ""; // 空字符串
String str7 = null; // null值
// 成功转换的例子
try {
double d1 = Double.parseDouble(str1);
System.out.println("字符串 '" + str1 + "' 转换为 double: " + d1);
double d2 = Double.parseDouble(str2);
System.out.println("字符串 '" + str2 + "' 转换为 double: " + d2);
double d3 = Double.parseDouble(str3);
System.out.println("字符串 '" + str3 + "' 转换为 double: " + d3);
double d4 = Double.parseDouble(str4);
System.out.println("字符串 '" + str4 + "' 转换为 double: " + d4);
} catch (NumberFormatException e) {
System.out.println("捕获到数字格式异常: " + e.getMessage());
}
// 转换失败的例子
try {
// 这会抛出 NumberFormatException
double d5 = Double.parseDouble(str5);
System.out.println("字符串 '" + str5 + "' 转换为 double: " + d5);
} catch (NumberFormatException e) {
System.out.println("字符串 '" + str5 + "' 无法转换为 double,捕获到异常: " + e.getMessage());
}
// 处理 null 值
try {
// 直接对 null 字符串调用 parseDouble 会抛出 NullPointerException
double d7 = Double.parseDouble(str7);
System.out.println("字符串 '" + str7 + "' 转换为 double: " + d7);
} catch (NullPointerException e) {
System.out.println("字符串为 null,捕获到空指针异常: " + e.getMessage());
}
}
}
输出结果:
字符串 '123.456' 转换为 double: 123.456
字符串 '-789.01' 转换为 double: -789.01
字符串 '3.1415926' 转换为 double: 3.1415926
字符串 '123' 转换为 double: 123.0
字符串 'abc' 无法转换为 double,捕获到异常: For input string: "abc"
字符串为 null,捕获到空指针异常: Cannot invoke "String.length()" because "str" is null
使用 Double 构造函数
你也可以通过创建一个 Double 对象来完成转换。Double 的构造函数会接收一个 String 参数。
语法
public Double(String s) throws NumberFormatException;
特点
- 返回值:一个
Double对象(double的包装类)。 - 异常:与方法一类似,如果字符串格式无效,同样会抛出
NumberFormatException。
示例代码
public class StringToDoubleConstructorExample {
public static void main(String[] args) {
String str1 = "987.65";
String str2 = "invalid";
// 成功转换
try {
Double doubleObj1 = new Double(str1);
// 获取其 double 值
double d1 = doubleObj1.doubleValue();
System.out.println("字符串 '" + str1 + "' 通过构造函数转换,值为: " + d1);
} catch (NumberFormatException e) {
System.out.println("捕获到数字格式异常: " + e.getMessage());
}
// 转换失败
try {
Double doubleObj2 = new Double(str2);
double d2 = doubleObj2.doubleValue();
System.out.println("字符串 '" + str2 + "' 通过构造函数转换,值为: " + d2);
} catch (NumberFormatException e) {
System.out.println("字符串 '" + str2 + "' 无法通过构造函数转换,捕获到异常: " + e.getMessage());
}
}
}
输出结果:
字符串 '987.65' 通过构造函数转换,值为: 987.65
字符串 'invalid' 无法通过构造函数转换,捕获到异常: For input string: "invalid"
parseDouble() vs. 构造函数
| 特性 | Double.parseDouble(String s) |
new Double(String s) |
|---|---|---|
| 返回类型 | double (基本数据类型) |
Double (包装类对象) |
| 性能 | 更高,直接返回基本类型,避免了对象的创建和内存开销。 | 较低,需要创建一个 Double 对象,有额外的开销。 |
| 使用场景 | 当你需要一个 double 值进行数学计算时(绝大多数情况)。 |
当你需要一个 Double 对象,例如存入一个 List<Double> 或作为泛型类型时,在现代 Java 中,更推荐使用 double 和自动装箱/拆箱。 |
| 推荐度 | 强烈推荐 | 不常用,除非有特殊需求。 |
重要注意事项和最佳实践
处理 NumberFormatException
这是最关键的。永远不要假设一个字符串一定能被成功转换,必须使用 try-catch 来处理可能的异常。

(图片来源网络,侵删)
// 错误的做法:不处理异常
String str = "hello";
double d = Double.parseDouble(str); // 程序会在这里崩溃并终止
// 正确的做法:处理异常
String str = "hello";
try {
double d = Double.parseDouble(str);
// 使用 d...
} catch (NumberFormatException e) {
System.out.println("错误: 输入的 '" + str + "' 不是一个有效的数字。");
// 可以设置一个默认值,或者提示用户重新输入
double defaultValue = 0.0;
}
处理 NullPointerException
如果传入的字符串是 null,parseDouble() 方法会抛出 NullPointerException,在调用前最好进行 null 检查。
String str = null;
// 安全的做法
if (str != null) {
try {
double d = Double.parseDouble(str);
System.out.println("转换成功: " + d);
} catch (NumberFormatException e) {
System.out.println("格式错误: " + e.getMessage());
}
} else {
System.out.println("输入字符串为 null,无法转换。");
}
处理国际化问题(千位分隔符)
Double.parseDouble() 不支持带有千位分隔符(如逗号 或空格)的数字字符串。"1,000.50" 会解析失败。
String strWithComma = "1,000.50"; // 这行代码会抛出 NumberFormatException // double d = Double.parseDouble(strWithComma);
解决方案: 在解析前,需要先将千位分隔符移除。
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class ParseWithLocale {
public static void main(String[] args) {
// 带有逗号作为千位分隔符的字符串
String strWithComma = "1,000.50";
// 带有空格作为千位分隔符的字符串
String strWithSpace = "1 000,50"; // 欧洲格式
// 使用 NumberFormat 处理带千位分隔符的数字
NumberFormat format = NumberFormat.getInstance(Locale.US); // 使用美国的格式
try {
Number number = format.parse(strWithComma);
double d = number.doubleValue();
System.out.println("解析 '" + strWithComma + "' 成功: " + d); // 输出: 1000.5
} catch (ParseException e) {
e.printStackTrace();
}
// 处理欧洲格式
NumberFormat euroFormat = NumberFormat.getInstance(Locale.FRANCE); // 使用法国的格式
try {
Number number = euroFormat.parse(strWithSpace);
double d = number.doubleValue();
System.out.println("解析 '" + strWithSpace + "' 成功: " + d); // 输出: 1000.5
} catch (ParseException e) {
e.printStackTrace();
}
}
}
| 场景 | 推荐方法 | 示例 |
|---|---|---|
| 标准转换(最常见) | Double.parseDouble() |
double d = Double.parseDouble("123.45"); |
需要 Double 对象 |
new Double() 或自动装箱 |
Double dObj = new Double("123.45"); 或 Double dObj = 123.45; |
| 字符串可能无效 | try-catch NumberFormatException |
见上文示例 |
字符串可能为 null |
先进行 null 检查 |
见上文示例 |
| 字符串含千位分隔符 | 使用 NumberFormat 和 Locale |
见上文示例 |
对于绝大多数 Java 开发场景,Double.parseDouble() 配合 try-catch 块 是将 String 转换为 double 的最佳实践。

(图片来源网络,侵删)
