杰瑞科技汇

Java double转字符串,如何避免精度丢失?

  1. doubleString:将数值类型转换为字符串类型。
  2. Stringdouble:将字符串类型转换为数值类型。

doubleString (Double to String)

double 转换为 String 有多种方法,每种方法都有其适用场景。

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

使用 String.valueOf(double d) (推荐)

这是最常用、最简单的方法,它会返回 double 参数的字符串表示形式。

public class DoubleToStringExample {
    public static void main(String[] args) {
        double myDouble = 123.456;
        // 使用 String.valueOf()
        String str1 = String.valueOf(myDouble);
        System.out.println("使用 String.valueOf(): " + str1);
        System.out.println("str1 的类型: " + str1.getClass().getName());
        // 结果: 123.456
    }
}

使用 Double.toString(double d)

Double 类提供了一个静态方法 toString(),效果与 String.valueOf() 非常相似。

public class DoubleToStringExample {
    public static void main(String[] args) {
        double myDouble = 789.012;
        // 使用 Double.toString()
        String str2 = Double.toString(myDouble);
        System.out.println("使用 Double.toString(): " + str2);
        System.out.println("str2 的类型: " + str2.getClass().getName());
        // 结果: 789.012
    }
}

使用字符串拼接 (Concatenation)

通过将 double 与一个空字符串 相连接,Java 会自动调用 toString() 方法。

public class DoubleToStringExample {
    public static void main(String[] args) {
        double myDouble = -3.14159;
        // 使用字符串拼接
        String str3 = "" + myDouble;
        System.out.println("使用字符串拼接: " + str3);
        System.out.println("str3 的类型: " + str3.getClass().getName());
        // 结果: -3.14159
    }
}

注意:这种方法虽然简单,但在性能上不如前两种方法,因为它会创建一个临时的 StringBuilder 对象。

Java double转字符串,如何避免精度丢失?-图2
(图片来源网络,侵删)

使用 String.format() (控制格式)

当你需要控制输出格式,例如保留指定位数的小数、使用科学计数法等时,String.format() 是最佳选择。

public class DoubleToStringFormatExample {
    public static void main(String[] args) {
        double myDouble = 123.456789;
        // 保留两位小数
        String str1 = String.format("%.2f", myDouble);
        System.out.println("保留两位小数: " + str1); // 输出: 123.46
        // 保留四位小数
        String str2 = String.format("%.4f", myDouble);
        System.out.println("保留四位小数: " + str2); // 输出: 123.4568
        // 使用科学计数法
        String str3 = String.format("%e", myDouble);
        System.out.println("科学计数法: " + str3); // 输出: 1.234568e+02
        // 添加千位分隔符,并保留两位小数
        String str4 = String.format("%,.2f", myDouble);
        System.out.println("带千位分隔符: " + str4); // 输出: 123.46
    }
}

Stringdouble (String to Double)

String 转换为 double 时,必须确保字符串是一个有效的数字表示,否则会抛出异常。

使用 Double.parseDouble(String s) (推荐)

这是最常用、最直接的方法,它尝试将字符串参数解析为 double

public class StringToDoubleExample {
    public static void main(String[] args) {
        String str1 = "123.456";
        String str2 = "-78.90";
        try {
            // 使用 Double.parseDouble()
            double d1 = Double.parseDouble(str1);
            System.out.println("字符串 '" + str1 + "' 转换为 double: " + d1);
            double d2 = Double.parseDouble(str2);
            System.out.println("字符串 '" + str2 + "' 转换为 double: " + d2);
        } catch (NumberFormatException e) {
            System.out.println("无法将字符串转换为 double: " + e.getMessage());
        }
    }
}

使用 Double.valueOf(String s)

Double.valueOf() 方法返回一个 Double 对象(double 的包装类),如果需要一个原始的 double 类型,需要再进行拆箱(unboxing)操作。

public class StringToDoubleExample {
    public static void main(String[] args) {
        String str = "314.159";
        // 使用 Double.valueOf(),返回的是 Double 对象
        Double doubleObject = Double.valueOf(str);
        System.out.println("Double 对象: " + doubleObject);
        System.out.println("doubleObject 的类型: " + doubleObject.getClass().getName());
        // 拆箱,获取原始 double 值
        double primitiveDouble = doubleObject; // 或者 double primitiveDouble = doubleObject.doubleValue();
        System.out.println("原始 double 值: " + primitiveDouble);
        System.out.println("primitiveDouble 的类型: " + ((Object)primitiveDouble).getClass().getName());
    }
}

异常处理:NumberFormatException

当字符串不是有效的数字格式时,上述两种方法都会抛出 NumberFormatException,在进行转换时,强烈建议使用 try-catch来处理这种潜在的错误。

常见的会导致异常的字符串:

  • 空字符串
  • null
  • 包含非数字字符的字符串(如 "12.3a4"
  • 只包含空格的字符串(),除非使用 trim() 预处理
  • 超出 double 范围的字符串(如 "1.7976931348623157E308"Double.MAX_VALUE,再大一点就会异常)
public class StringToDoubleExceptionExample {
    public static void main(String[] args) {
        String invalidStr1 = "hello";
        String invalidStr2 = "";
        String validStr = "123.45";
        System.out.println("尝试转换无效字符串: '" + invalidStr1 + "'");
        try {
            Double.parseDouble(invalidStr1);
        } catch (NumberFormatException e) {
            System.out.println("捕获到异常: " + e.getMessage());
        }
        System.out.println("\n尝试转换空字符串: '" + invalidStr2 + "'");
        try {
            Double.parseDouble(invalidStr2);
        } catch (NumberFormatException e) {
            System.out.println("捕获到异常: " + e.getMessage());
        }
        System.out.println("\n尝试转换有效字符串: '" + validStr + "'");
        try {
            double d = Double.parseDouble(validStr);
            System.out.println("转换成功! 结果是: " + d);
        } catch (NumberFormatException e) {
            System.out.println("捕获到异常: " + e.getMessage());
        }
    }
}

总结与最佳实践

转换方向 推荐方法 说明
doubleString String.valueOf(double d) 最简单、最常用。
String.format() 当需要对格式进行精细控制时(如保留小数位数、科学计数法)。
Stringdouble Double.parseDouble(String s) 最直接,直接返回原始 double 值。
Double.valueOf(String s) 返回 Double 对象,适用于需要对象引用的场景。

核心要点:

  1. doubleString:通常直接使用 String.valueOf() 即可,格式化需求用 String.format()
  2. Stringdouble永远使用 try-catch来包裹 Double.parseDouble()Double.valueOf(),以优雅地处理可能发生的 NumberFormatException
  3. 注意空格:如果字符串前后可能有空格(" 123.45 "),先用 str.trim() 方法去除首尾空格,再进行转换,这样可以避免不必要的异常。
分享:
扫描分享到社交APP
上一篇
下一篇