杰瑞科技汇

Java中double转double,精度会变吗?

在 Java 中,将一个 double 类型转换为另一个 double 类型是一个直接的过程,因为 double 本身就是一个基本数据类型,这通常涉及到两种情况:

Java中double转double,精度会变吗?-图1
(图片来源网络,侵删)
  1. 直接赋值:从一个 double 变量赋值给另一个 double 变量。
  2. 从其他类型转换:将其他数值类型(如 int, float, String 等)转换为 double 类型。

下面我将详细解释这两种情况,并提供代码示例。


直接赋值

这是最简单的情况。double 是一个 64 位的浮点数,在赋值时,Java 会直接复制其二进制值。

示例代码:

public class DoubleExample {
    public static void main(String[] args) {
        double originalDouble = 123.456;
        // 将 originalDouble 的值直接赋值给 newDouble
        double newDouble = originalDouble;
        System.out.println("原始值: " + originalDouble);
        System.out.println("新值: " + newDouble);
        System.out.println("它们是同一个值吗? " + (originalDouble == newDouble)); // 输出 true
    }
}

输出:

Java中double转double,精度会变吗?-图2
(图片来源网络,侵删)
原始值: 123.456
新值: 123.456
它们是同一个值吗? true

在这个例子中,newDouble 只是 originalDouble 的一个副本,因为它们都是 double 类型,所以不需要任何特殊的转换操作。


从其他类型转换为 double

这是更常见的情况,当您需要将整数、浮点数或字符串等转换为 double 时。

int 或其他整数类型转换

当将一个 int(或其他整数类型,如 long, short, byte)赋值给一个 double 变量时,Java 会自动进行 widening primitive conversion (扩展基本类型转换),这意味着整数会被精确地转换为其浮点数表示形式,不会丢失信息。

示例代码:

Java中double转double,精度会变吗?-图3
(图片来源网络,侵删)
public class DoubleConversion {
    public static void main(String[] args) {
        int myInt = 100;
        long myLong = 200L;
        // 从 int 转换为 double
        double fromInt = myInt;
        // 从 long 转换为 double
        double fromLong = myLong;
        System.out.println("从 int 转换的 double: " + fromInt); // 输出 100.0
        System.out.println("从 long 转换的 double: " + fromLong); // 输出 200.0
    }
}

float 转换

float 是 32 位浮点数,double 是 64 位浮点数,将 float 转换为 double 也是一种扩展转换,会保留 float 的精度,并将其填充到 double 的 64 位空间中。

示例代码:

public class FloatToDouble {
    public static void main(String[] args) {
        float myFloat = 123.45f; // 注意 f 后缀
        // 从 float 转换为 double
        double fromFloat = myFloat;
        System.out.println("原始 float 值: " + myFloat);
        System.out.println("转换后的 double 值: " + fromFloat);
    }
}

输出:

原始 float 值: 123.45
转换后的 double 值: 123.45

String 转换

这是一个非常常见的场景,通常需要处理用户输入或从文件/数据库中读取的数字,这里不能使用简单的赋值,必须使用 Double 包装类的 parseDouble()valueOf() 静态方法。

  • Double.parseDouble(String s): 将字符串解析为 double 原始类型,如果字符串格式无效,会抛出 NumberFormatException
  • Double.valueOf(String s): 将字符串解析为 Double 对象,同样,如果格式无效,会抛出 NumberFormatException

示例代码:

public class StringToDouble {
    public static void main(String[] args) {
        String strNumber = "987.65";
        String invalidStr = "hello";
        try {
            // 使用 parseDouble() 转换为原始 double 类型
            double parsedDouble = Double.parseDouble(strNumber);
            System.out.println("使用 parseDouble() 转换的结果: " + parsedDouble);
            System.out.println("转换后的类型是: " + ((Object)parsedDouble).getClass().getSimpleName()); // 输出 double
            // 使用 valueOf() 转换为 Double 对象
            Double doubleObject = Double.valueOf(strNumber);
            System.out.println("使用 valueOf() 转换的结果: " + doubleObject);
            System.out.println("转换后的类型是: " + doubleObject.getClass().getSimpleName()); // 输出 Double
        } catch (NumberFormatException e) {
            System.err.println("无法将字符串转换为 double: " + invalidStr);
            e.printStackTrace();
        }
    }
}

输出:

使用 parseDouble() 转换的结果: 987.65
转换后的类型是: double
使用 valueOf() 转换的结果: 987.65
转换后的类型是: Double

重要注意事项

精度问题

浮点数(floatdouble)在计算机中是以二进制形式存储的,很多十进制小数无法被精确表示,这会导致精度损失。

示例:

double a = 0.1 + 0.2;
System.out.println(a); // 输出可能是 0.30000000000000004
// 为了解决这个问题,可以使用 BigDecimal
import java.math.BigDecimal;
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
BigDecimal sum = bd1.add(bd2);
System.out.println(sum); // 输出 0.3

舍入问题

当进行数学运算时,结果可能会超出 double 的表示范围或精度,需要进行舍入。java.lang.Math 类提供了一些方法,如 round()

示例:

double value = 123.456;
long roundedLong = Math.round(value); // 四舍五入为 long
System.out.println("四舍五入为 long: " + roundedLong); // 输出 123
// 如果想四舍五入并保留指定位数的小数,可以乘以一个数,取整,再除以这个数
double value2 = 123.456;
double roundedToTwoDecimals = Math.round(value2 * 100.0) / 100.0;
System.out.println("四舍五入到两位小数: " + roundedToTwoDecimals); // 输出 123.46
转换来源 方法 示例 备注
另一个 double 直接赋值 double d2 = d1; 最简单,直接复制值。
int, long 自动扩展转换 double d = 100; 精确转换,无信息丢失。
float 自动扩展转换 float f = 123.45f; double d = f; 精度从 32 位提升到 64 位。
String Double.parseDouble() double d = Double.parseDouble("123.45"); 返回原始 double,可能抛出异常。
String Double.valueOf() Double dObj = Double.valueOf("123.45"); 返回 Double 对象,可能抛出异常。

在处理涉及金钱或需要高精度计算的场景时,应避免使用 doublefloat,而应使用 java.math.BigDecimal 类。

分享:
扫描分享到社交APP
上一篇
下一篇