使用 Double.parseDouble() (最常用)
这是最直接、最常用的方法,它是一个静态方法,专门用于将 String 转换为 double 原始类型。

(图片来源网络,侵删)
语法
double doubleValue = Double.parseDouble(String str);
示例代码
public class StringToDoubleExample {
public static void main(String[] args) {
String str1 = "123.45";
String str2 = "-78.90";
String str3 = "3.1415926";
// 转换并打印
double d1 = Double.parseDouble(str1);
double d2 = Double.parseDouble(str2);
double d3 = Double.parseDouble(str3);
System.out.println("字符串 '" + str1 + "' 转换为 double: " + d1);
System.out.println("字符串 '" + str2 + "' 转换为 double: " + d2);
System.out.println("字符串 '" + str3 + "' 转换为 double: " + d3);
// 计算示例
double sum = d1 + d2;
System.out.println(str1 + " + " + str2 + " = " + sum);
}
}
输出:
字符串 '123.45' 转换为 double: 123.45
字符串 '-78.9' 转换为 double: -78.9
字符串 '3.1415926' 转换为 double: 3.1415926
123.45 + -78.9 = 44.55
使用 Double.valueOf() (返回包装类)
这个方法也可以将 String 转换为 double,但它返回的是 Double 对象(即 double 的包装类),而不是原始的 double 类型,如果你需要一个对象(在泛型集合 List<Double> 中使用),这个方法很有用。
语法
Double doubleObject = Double.valueOf(String str);
示例代码
public class StringToDoubleWrapperExample {
public static void main(String[] args) {
String str = "99.99";
// valueOf() 返回一个 Double 对象
Double doubleObject = Double.valueOf(str);
// 如果需要原始类型,可以自动拆箱
double primitiveDouble = doubleObject;
System.out.println("字符串 '" + str + "' 转换为 Double 对象: " + doubleObject);
System.out.println("Double 对象的值: " + primitiveDouble);
System.out.println("Double 对象的类型: " + doubleObject.getClass().getName());
}
}
输出:
字符串 '99.99' 转换为 Double 对象: 99.99
Double 对象的值: 99.99
Double 对象的类型: java.lang.Double
重要:异常处理 (NumberFormatException)
String 的格式不正确,上述两种方法都会抛出 NumberFormatException 异常。在生产环境中,你必须使用 try-catch 块来处理这种可能性。

(图片来源网络,侵删)
什么情况下会抛出异常?
- 字符串不是有效的数字格式(
"abc","12a34")。 - 字符串为
null或空 。 - 字符串表示的数字超出
double的范围(一个非常非常大的数)。
示例:使用 try-catch 进行安全转换
public class SafeStringToDoubleConversion {
public static void main(String[] args) {
String[] inputs = {
"123.45",
"-67.89",
"not a number",
"123,45", // 在某些地区是有效的,但在 Java 默认中不是
"1.7976931348623157E308", // 超出 double 范围
null,
""
};
for (String input : inputs) {
try {
// 检查 null 或空字符串,避免 NullPointerException
if (input == null || input.trim().isEmpty()) {
System.out.println("输入 '" + input + "' 是无效的(null 或空字符串)。");
continue;
}
double value = Double.parseDouble(input);
System.out.println("成功转换 '" + input + "' 为: " + value);
} catch (NumberFormatException e) {
System.out.println("无法转换 '" + input + "',原因:格式不正确。");
}
}
}
}
输出:
成功转换 '123.45' 为: 123.45
成功转换 '-67.89' 为: -67.89
无法转换 'not a number',原因:格式不正确。
无法转换 '123,45',原因:格式不正确。
无法转换 '1.7976931348623157E308',原因:格式不正确。
输入 'null' 是无效的(null 或空字符串)。
输入 '' 是无效的(null 或空字符串)。
处理不同地区的数字格式
在某些国家/地区,小数点是用逗号 () 表示的,而不是点 (),直接使用 Double.parseDouble() 会失败。
解决方案是使用 java.text.NumberFormat 和 java.util.Locale。
示例:解析欧洲格式的数字 (使用逗号)
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class LocaleSensitiveParsing {
public static void main(String[] args) {
String germanNumber = "123,45"; // 德语格式,逗号是小数点
String usNumber = "123.45"; // 美国格式,点是小数点
// 1. 解析德语格式的数字
NumberFormat germanFormat = NumberFormat.getInstance(Locale.GERMAN);
try {
double germanValue = germanFormat.parse(germanNumber).doubleValue();
System.out.println("德语数字 '" + germanNumber + "' 转换为: " + germanValue);
} catch (ParseException e) {
System.err.println("解析德语数字失败: " + e.getMessage());
}
// 2. 尝试用默认格式解析德语数字(会失败)
try {
// 这会抛出 NumberFormatException,因为默认 locale 可能不是德国
double value = Double.parseDouble(germanNumber);
System.out.println("直接解析德语数字 '" + germanNumber + "' 为: " + value);
} catch (NumberFormatException e) {
System.out.println("直接解析德语数字 '" + germanNumber + "' 失败,符合预期。");
}
// 3. 解析美国格式的数字
NumberFormat usFormat = NumberFormat.getInstance(Locale.US);
try {
double usValue = usFormat.parse(usNumber).doubleValue();
System.out.println("美国数字 '" + usNumber + "' 转换为: " + usValue);
} catch (ParseException e) {
System.err.println("解析美国数字失败: " + e.getMessage());
}
}
}
输出 (在默认 locale 为 US 的系统上):

(图片来源网络,侵删)
德语数字 '123,45' 转换为: 123.45
直接解析德语数字 '123,45' 失败,符合预期。
美国数字 '123.45' 转换为: 123.45
总结与最佳实践
| 方法 | 返回类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
Double.parseDouble() |
double (原始类型) |
最常用、最直接、性能稍好 | 抛出 NumberFormatException |
当你确定字符串格式正确,或者已经准备好处理异常时,绝大多数情况下使用此方法。 |
Double.valueOf() |
Double (包装类) |
返回一个对象,可用于泛型 | 需要额外的拆箱步骤才能得到原始类型 | 当你需要一个 Double 对象而不是 double 原始类型时。 |
NumberFormat |
double (通过 parse().doubleValue()) |
非常灵活,能处理不同地区的数字格式(如 vs ) | 代码更复杂,性能较差 | 当你需要处理来自不同国家或地区的用户输入时。 |
核心建议:
- 首选
Double.parseDouble():对于大多数内部逻辑或数据转换,这是最简单、最有效的方法。 - 总是进行异常处理:使用
try-catch (NumberFormatException)来防止因无效输入导致程序崩溃。 - 处理
null和空字符串:在调用解析方法前,检查字符串是否为null或空,这是一个良好的编程习惯。 - 考虑本地化:如果你的应用需要国际化,并且用户可能输入
