杰瑞科技汇

Java integer转long会丢失精度吗?

int 转换为 long 最简单、最常用的方法是直接赋值,由于 long 的表示范围比 int 大,所以这个转换是安全的,不会造成数据丢失。

Java integer转long会丢失精度吗?-图1
(图片来源网络,侵删)
int myInt = 100;
long myLong = myInt; // 这是最推荐的方式

详细解释与多种方法

直接赋值(隐式类型转换)

这是最直接、最简单的方法,当将一个 int 类型的值赋给一个 long 类型的变量时,Java 编译器会自动进行类型转换,这个过程称为隐式类型转换拓宽转换

为什么这是安全的?

  • int 是 32 位有符号整数,取值范围是 -2,147,483,6482,147,483,647
  • long 是 64 位有符号整数,取值范围是 -9,223,372,036,854,775,8089,223,372,036,854,775,807

因为 long 的范围完全包含了 int 的范围,所以任何一个 int 的值都可以无损地存入 long 变量中。

示例代码:

Java integer转long会丢失精度吗?-图2
(图片来源网络,侵删)
public class IntToLongExample {
    public static void main(String[] args) {
        int intNumber = 123456;
        // 隐式转换
        long longNumber1 = intNumber;
        System.out.println("通过隐式转换得到的 long 值: " + longNumber1);
        System.out.println("longNumber1 的类型: " + ((Object)longNumber1).getClass().getName()); // 输出 java.lang.Long
        // 另一个例子
        int maxInt = Integer.MAX_VALUE; // 2147483647
        long longNumber2 = maxInt;
        System.out.println("int 的最大值转换为 long: " + longNumber2); // 2147483647,值没有改变
    }
}

使用强制类型转换(显式类型转换)

虽然隐式转换已经足够,但你也可以使用强制类型转换(也称为显式类型转换)来达到同样的目的,这会让代码的意图更加明确,虽然在这个场景下有些多余。

语法:(long) 变量名

示例代码:

public class IntToLongExplicit {
    public static void main(String[] args) {
        int intNumber = 789;
        // 显式转换
        long longNumber = (long) intNumber;
        System.out.println("通过显式转换得到的 long 值: " + longNumber);
    }
}

注意:intlong 的场景下,强制转换不是必需的,因为编译器知道这是安全的,强制转换通常用于缩小转换(如 longint),这种转换可能会丢失数据,所以需要程序员明确告知编译器“我知道风险,请进行转换”。


使用 Long 构造函数或 valueOf()

你还可以通过创建 Long 对象的方式来进行转换,这在需要 Long 对象而不是 long 原始类型时非常有用。

使用 Long 构造函数(已过时,不推荐) Long 类的构造函数在 Java 9 中被标记为过时,官方文档建议使用 valueOf() 方法,因为它可以利用缓存来提高性能和减少内存占用。

// 不推荐的方式
int intNumber = 555;
Long longObject = new Long(intNumber);

使用 Long.valueOf()(推荐) Long.valueOf() 方法接受一个 int 参数并返回一个 Long 对象,对于在 [-128, 127] 范围内的值,它会返回缓存的对象,避免频繁创建新对象。

public class IntToLongObject {
    public static void main(String[] args) {
        int intNumber = 100;
        // 使用 valueOf() 获取 Long 对象
        Long longObject = Long.valueOf(intNumber);
        System.out.println("通过 valueOf() 得到的 Long 对象: " + longObject);
        System.out.println("longObject 的类型: " + longObject.getClass().getName()); // 输出 java.lang.Long
    }
}

使用 Long.parseLong() 这个方法通常用于将 String 转换为 long,但它也可以接受一个 int 作为参数,因为 int 可以被自动提升为 String

public class IntToLongParse {
    public static void main(String[] args) {
        int intNumber = 2025;
        // parseInt() 返回的是原始类型 long
        long longPrimitive = Long.parseLong(String.valueOf(intNumber));
        System.out.println("通过 parseLong() 得到的 long 原始值: " + longPrimitive);
    }
}

这种方法相对繁琐,不如直接赋值或 valueOf() 高效,通常不用于 intlong 的转换。


特殊情况:处理大整数(int 的溢出问题)

虽然 intlong 不会丢失数据,但如果你在转换前,int 变量本身就因为计算而溢出了,那么转换后的 long 值也会是那个错误的、溢出后的值。

示例:

public class IntOverflowToLong {
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE; // 2147483647
        int b = 1;
        // 这个计算会导致 int 溢出
        int result = a + b; // 结果会是 -2147483648
        System.out.println("溢出后的 int 值: " + result);
        // 将这个溢出的值转换为 long
        long longResult = result;
        System.out.println("溢出后的 int 转换为 long 的值: " + longResult); // -2147483648
        // 正确的做法:在计算时就提升为 long
        long correctResult = (long)a + b; // 先将 a 提升为 long,再计算
        System.out.println("正确的 long 计算结果: " + correctResult); // 2147483648
    }
}

转换本身是安全的,但请确保转换前的 int 数据是正确的,如果担心大数计算溢出,应该在计算开始时就使用 long 类型。


总结与最佳实践

方法 类型 描述 推荐度
long l = i; 原始类型 -> 原始类型 隐式转换,最简单、最直接。 ⭐⭐⭐⭐⭐ (首选)
long l = (long) i; 原始类型 -> 原始类型 显式转换,意图明确,但在此场景下非必需。 ⭐⭐⭐
Long L = Long.valueOf(i); 原始类型 -> 对象 获取 Long 包装类对象,推荐使用此方法。 ⭐⭐⭐⭐ (需要对象时)
long l = Long.parseLong("" + i); 原始类型 -> 原始类型 繁琐,效率低,不推荐用于此转换。

最佳实践:

  1. 如果只需要 long 原始类型:直接使用隐式转换 long myLong = myInt;,这是最简洁、最高效的方式。
  2. 如果需要一个 Long 对象:使用 Long.valueOf(myInt),这是现代 Java 的标准做法,性能更好。
  3. 在进行可能溢出的数学运算前:尽早将操作数(如 int)转换为 long,以避免 int 范围内的溢出。long sum = (long)a + b;
分享:
扫描分享到社交APP
上一篇
下一篇