杰瑞科技汇

Java long long 类型如何转换?

long 在 Java 中是一个 64 位(8字节)的有符号整数,范围是 -2^632^63-1(即 -9,223,372,036,854,775,8089,223,372,036,854,775,807)。

Java long 类型如何转换?-图1
(图片来源网络,侵删)

下面我将从其他类型转 longlong 转其他类型 两个方面,以及需要注意的常见问题来详细说明。


其他类型转换为 long

这是最常见的需求,比如将 intString 或其他类型的数值转为 long

基本数据类型转换

基本数据类型之间的转换遵循“小类型可以自动转换为大类型,大类型强制转换为小类型可能会丢失精度”的原则。

  • byte, short, intlong (自动/隐式转换) long 的范围比 int 大,所以可以直接转换,不会丢失数据。

    Java long 类型如何转换?-图2
    (图片来源网络,侵删)
    int intValue = 123456;
    long longValue1 = intValue; // 自动转换,不需要任何操作
    System.out.println(longValue1); // 输出: 123456
    short shortValue = 100;
    long longValue2 = shortValue; // 自动转换
    System.out.println(longValue2); // 输出: 100
  • float, doublelong (强制转换) 浮点数(float, double)和整数(long)是不同的数据类型,直接转换会截断小数部分,而不是四舍五入。

    double doubleValue = 123.45;
    long longValue3 = (long) doubleValue; // 强制转换,小数部分被丢弃
    System.out.println(longValue3); // 输出: 123
    float floatValue = 789.99f;
    long longValue4 = (long) floatValue;
    System.out.println(longValue4); // 输出: 789

包装类转换

  • Integer, Short, Bytelong 可以直接使用 .longValue() 方法,或者利用自动装箱/拆箱机制。

    Integer integerObj = Integer.valueOf(98765);
    long longValue5 = integerObj.longValue(); // 使用 longValue() 方法
    System.out.println(longValue5); // 输出: 98765
    // 自动拆箱为 int,然后自动提升为 long
    long longValue6 = integerObj;
    System.out.println(longValue6); // 输出: 98765
  • Float, Doublelong 同样,需要强制转换,并且会截断小数。

    Double doubleObj = Double.valueOf(321.789);
    long longValue7 = (long) doubleObj; // 强制转换
    System.out.println(longValue7); // 输出: 321

String 转换为 long

这是非常常见的需求,例如从配置文件或用户输入中读取数字,必须使用 Long.parseLong() 方法。

Java long 类型如何转换?-图3
(图片来源网络,侵删)
  • Stringlong

    String strNumber = "123456789012345";
    // 正常情况
    long longValue8 = Long.parseLong(strNumber);
    System.out.println(longValue8); // 输出: 123456789012345
    // 如果字符串不是有效的数字格式,会抛出 NumberFormatException
    try {
        Long.parseLong("hello");
    } catch (NumberFormatException e) {
        System.out.println("捕获到异常: " + e.getMessage());
    }
    // 如果数字超出 long 的范围,也会抛出 NumberFormatException
    try {
        Long.parseLong("9223372036854775808"); // 比 Long.MAX_VALUE 还大
    } catch (NumberFormatException e) {
        System.out.println("捕获到异常: 数字超出范围");
    }

long 转换为其他类型

转换为基本数据类型

  • longint, short, byte (强制转换) long 的范围比 int 大,所以必须强制转换。long 的值超出了目标类型的范围,数据会溢出,得到一个不正确的结果。

    long bigLong = 2147483648L; // 比 Integer.MAX_VALUE (2147483647) 大
    // 强制转换为 int,会发生溢出
    int intValue = (int) bigLong;
    System.out.println(intValue); // 输出: -2147483648 (溢出后的结果)
    // 强制转换为 byte,同样会溢出
    long anotherLong = 130L;
    byte byteValue = (byte) anotherLong;
    System.out.println(byteValue); // 输出: -126 (130 - 128 = 2, 但符号位变化,导致溢出)
  • longfloat, double (自动/隐式转换) floatdouble 是浮点数类型,它们的表示范围远大于 long,这种转换是自动的,但需要注意浮点数可能存在精度损失,因为 long 是精确的整数,而 float/double 使用科学计数法存储,可能无法精确表示所有 long 值。

    long veryLong = 1234567890123456789L;
    double doubleValue = veryLong; // 自动转换
    System.out.println(doubleValue); // 输出: 1.2345678901234568E18 (精度可能略有变化)
    float floatValue = veryLong; // 自动转换
    System.out.println(floatValue); // 输出: 1.2345679E18 (精度损失更明显)

转换为包装类

  • longLong (自动装箱) Java 5 引入了自动装箱,可以直接将 long 赋值给 Long 对象。

    long primitiveLong = 999L;
    Long longObject = primitiveLong; // 自动装箱
    System.out.println(longObject); // 输出: 999

long 转换为 String

有几种方法可以实现,最推荐的是使用 String.valueOf()

  • longString

    long myLong = 9876543210L;
    // 方法1: 推荐,性能最好
    String str1 = String.valueOf(myLong);
    System.out.println(str1); // 输出: 9876543210
    // 方法2: 也可以,但不如 String.valueOf 高效
    String str2 = Long.toString(myLong);
    System.out.println(str2); // 输出: 9876543210
    // 方法3: 使用字符串拼接,底层也是调用 String.valueOf
    String str3 = myLong + "";
    System.out.println(str3); // 输出: 9876543210

重要注意事项和最佳实践

  1. long 字面量 在 Java 中,如果一个整数字面量超过了 int 的范围(2147483647),你必须在其后加上 Ll 来表示它是一个 long 类型。强烈推荐使用大写的 L,因为小写的 l 容易被误认为是数字 1

    // 正确
    long num1 = 2147483648L;
    // 错误!编译失败:2147483648 超出了 int 范围
    // long num2 = 2147483648;
    // 不推荐,容易混淆
    long num3 = 100l;
  2. 溢出问题 在进行 longint 等小类型的强制转换时,Java 不会在编译时或运行时抛出溢出异常,它会静默地截断高位数据,得到一个毫无意义的负数或很小的正数,如果你需要检查溢出,可以使用 Math 的辅助方法。

    long bigValue = Long.MAX_VALUE;
    int intValue = (int) bigValue;
    System.out.println("原始 long 值: " + bigValue); // 9223372036854775807
    System.out.println("强制转换后 int 值: " + intValue); // -1
    // 使用 Math.addExact 等方法可以检测算术运算中的溢出
    try {
        long result = Math.addExact(Long.MAX_VALUE, 1);
    } catch (ArithmeticException e) {
        System.out.println("捕获到算术溢出异常!");
    }
  3. String 转换的异常处理 使用 Long.parseLong() 时,如果输入的字符串格式不正确或数字超出范围,会抛出 NumberFormatException,在处理可能不可靠的输入时(如用户输入、文件读取),务必使用 try-catch 块来处理这个异常。

    String userInput = "not a number";
    try {
        long number = Long.parseLong(userInput);
        System.out.println("转换成功: " + number);
    } catch (NumberFormatException e) {
        System.out.println("输入无效,请输入一个有效的整数。");
    }

总结表

源类型 目标类型 转换方式 说明
int, short, byte long long l = intValue; 自动转换,无精度损失
float, double long long l = (long) dValue; 强制转换,截断小数
String long long l = Long.parseLong(str); 必须使用,可能抛出 NumberFormatException
long int, short, byte int i = (int) lValue; 强制转换,可能溢出
long float, double double d = lValue; 自动转换,可能损失精度
long String String s = String.valueOf(l); 推荐,无精度损失
long Long Long L = lValue; 自动装箱
分享:
扫描分享到社交APP
上一篇
下一篇