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

- 直接赋值:从一个
double变量赋值给另一个double变量。 - 从其他类型转换:将其他数值类型(如
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
}
}
输出:

原始值: 123.456
新值: 123.456
它们是同一个值吗? true
在这个例子中,newDouble 只是 originalDouble 的一个副本,因为它们都是 double 类型,所以不需要任何特殊的转换操作。
从其他类型转换为 double
这是更常见的情况,当您需要将整数、浮点数或字符串等转换为 double 时。
从 int 或其他整数类型转换
当将一个 int(或其他整数类型,如 long, short, byte)赋值给一个 double 变量时,Java 会自动进行 widening primitive conversion (扩展基本类型转换),这意味着整数会被精确地转换为其浮点数表示形式,不会丢失信息。
示例代码:

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
重要注意事项
精度问题
浮点数(float 和 double)在计算机中是以二进制形式存储的,很多十进制小数无法被精确表示,这会导致精度损失。
示例:
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 对象,可能抛出异常。 |
在处理涉及金钱或需要高精度计算的场景时,应避免使用 double 和 float,而应使用 java.math.BigDecimal 类。
