杰瑞科技汇

Java String转Double如何避免精度丢失?

使用 Double.parseDouble() (推荐)

这是最常用、最直接的方法,它是一个静态方法,可以直接通过 Double 类调用。

Java String转Double如何避免精度丢失?-图1
(图片来源网络,侵删)

语法

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 来处理可能的异常。

Java String转Double如何避免精度丢失?-图2
(图片来源网络,侵删)
// 错误的做法:不处理异常
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

如果传入的字符串是 nullparseDouble() 方法会抛出 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 检查 见上文示例
字符串含千位分隔符 使用 NumberFormatLocale 见上文示例

对于绝大多数 Java 开发场景,Double.parseDouble() 配合 try-catch 是将 String 转换为 double 的最佳实践。

Java String转Double如何避免精度丢失?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇