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

下面我将从其他类型转 long 和 long 转其他类型 两个方面,以及需要注意的常见问题来详细说明。
其他类型转换为 long
这是最常见的需求,比如将 int、String 或其他类型的数值转为 long。
基本数据类型转换
基本数据类型之间的转换遵循“小类型可以自动转换为大类型,大类型强制转换为小类型可能会丢失精度”的原则。
-
byte,short,int→long(自动/隐式转换)long的范围比int大,所以可以直接转换,不会丢失数据。
(图片来源网络,侵删)int intValue = 123456; long longValue1 = intValue; // 自动转换,不需要任何操作 System.out.println(longValue1); // 输出: 123456 short shortValue = 100; long longValue2 = shortValue; // 自动转换 System.out.println(longValue2); // 输出: 100
-
float,double→long(强制转换) 浮点数(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,Byte→long可以直接使用.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,Double→long同样,需要强制转换,并且会截断小数。Double doubleObj = Double.valueOf(321.789); long longValue7 = (long) doubleObj; // 强制转换 System.out.println(longValue7); // 输出: 321
String 转换为 long
这是非常常见的需求,例如从配置文件或用户输入中读取数字,必须使用 Long.parseLong() 方法。

-
String→longString 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 转换为其他类型
转换为基本数据类型
-
long→int,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, 但符号位变化,导致溢出)
-
long→float,double(自动/隐式转换)float和double是浮点数类型,它们的表示范围远大于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 (精度损失更明显)
转换为包装类
-
long→Long(自动装箱) Java 5 引入了自动装箱,可以直接将long赋值给Long对象。long primitiveLong = 999L; Long longObject = primitiveLong; // 自动装箱 System.out.println(longObject); // 输出: 999
long 转换为 String
有几种方法可以实现,最推荐的是使用 String.valueOf()。
-
long→Stringlong 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
重要注意事项和最佳实践
-
long字面量 在 Java 中,如果一个整数字面量超过了int的范围(2147483647),你必须在其后加上L或l来表示它是一个long类型。强烈推荐使用大写的L,因为小写的l容易被误认为是数字1。// 正确 long num1 = 2147483648L; // 错误!编译失败:2147483648 超出了 int 范围 // long num2 = 2147483648; // 不推荐,容易混淆 long num3 = 100l;
-
溢出问题 在进行
long到int等小类型的强制转换时,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("捕获到算术溢出异常!"); } -
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; |
自动装箱 |
