如何在Java中将long转换为int?


Answers:


371

在Java 8中进行了更新:

Math.toIntExact(value);

原始答案:

简单类型转换应该做到这一点:

long l = 100000;
int i = (int) l;

但是请注意,大量数字(通常大于2147483647和小于-2147483648)会丢失一些位,并且显示不正确。

例如,2147483648将表示为-2147483648


整数的精度是多少?o_O
khachik 2010年

3
@khachik我认为精度是1或课程的:)也许42
extraneon

7
转换对于对象和原始类型具有不同的含义。(int)l不会尝试将64位整数视为32位整数,而是实际上返回具有相同的32位低阶位的另一个32位整数。使用对象,您可以转换到更具体的子类,但是使用primitve类型,转换实际上不是转换,而是转换。
dspyz 2010年

整数x =(int)((((Long)Integer.MAX_INTEGER)+10); 如果在这种情况下转换未检测到x的值不合适,那么您就没有解决方案。
13年

Math.toIntExact()实际上是一个很棒的方法。如果值太大而无法容纳在int中,则抛出该异常。谢谢你的建议。
java-addict301 '19

182
Long x = 100L;
int y = x.intValue();


3
我会说这是最好的方法。
Simmant

这种方式与仅投射值之间有什么区别?我认为,这是intValue()在后台执行的所有操作。
蒂姆·维斯曼(TimWißmann)'18年

1
注意类型。long在这里不是原始的。它Long不能直接转换为原始类型的引用类型intint y = (int)x;将抛出一个执行,但int y = (int)(long)x会起作用。(原因是自动装箱)
akop

58

对于较小的值,强制转换就足够了:

long l = 42;
int i = (int) l;

但是,与long相比,a 可以容纳更多的信息int,因此在通常情况下,不可能完美地从转换longint。如果long保留的数字小于或等于Integer.MAX_VALUE您可以通过转换进行转换而不会丢失任何信息。

例如,以下示例代码:

System.out.println( "largest long is " + Long.MAX_VALUE );
System.out.println( "largest int is " + Integer.MAX_VALUE );

long x = (long)Integer.MAX_VALUE;
x++;
System.out.println("long x=" + x);

int y = (int) x;
System.out.println("int y=" + y);

在我的机器上产生以下输出:

largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648

注意上的负号y。由于x其值比Integer.MAX_VALUE大一,int y因此无法持有它。在这种情况下,它环绕到负数。

如果您想自己处理这种情况,可以执行以下操作:

if ( x > (long)Integer.MAX_VALUE ) {
    // x is too big to convert, throw an exception or something useful
}
else {
    y = (int)x;
}

所有这些都假定为正数。对于负数,请使用MIN_VALUE代替“ MAX_VALUE”


因此,正确的转换将是检测转换是否安全,否则抛出异常。@Andrej Herich所说的事实暗示了Guava库。
13年

55

从Java 8开始,您可以使用:Math.toIntExact(long value)

参见JavaDoc:Math.toIntExact

返回long参数的值;如果该值溢出一个int,则引发异常。

Math.toIntExactJDK 8中的源代码:

public static int toIntExact(long value) {
    if ((int)value != value) {
        throw new ArithmeticException("integer overflow");
    }
    return (int)value;
}

37

如果使用番石榴库,有方法Ints.checkedCast(long),并Ints.saturatedCast(long)转换longint


4
无需使用库
Grekz 2013年

6
@Grekz由OP决定。我会在这种情况下。除非您有实际的理由不使用更多的依赖罐,否则更多的依赖罐比重新发明的轮子更好。
djechlin

1
恕我直言,这个答案比公认的答案要好得多,因为它永远不会做意想不到的事情。
Mark Slater 2014年

5
由于我的项目已经包含了该jar,因此使用它比编写一个新的帮助程序更加有益
Osify 2015年


18

您可以使用Long包装器而不是long原始的并调用

Long.intValue()

Java7 intValue()文档

它会相应地舍入/截断该long值以适合int


链接到当前文档并进行扩展可能是一个好主意-在将long转换为int时,不可避免地会有一些舍入。
Makoto 2012年

2
查看Long.intValue()的Java 7实现,它只是强制转换。没有执行下溢/上溢检查。因此,至少通过Java 7,此选项等效于:(int)someLong。
buzz3791 2013年

为什么更少的投票?我发现这是最有价值的答案之一
Anand j。Kadhi

3

如果直接转换显示错误,则可以这样操作:

Long id = 100;
int int_id = (int) (id % 100000);

2

在Java中,long是带符号的64位数字,这意味着您可以存储-9,223,372,036,854,775,808和9,223,372,036,854,775,807(含)之间的数字。

另一方面,int是带符号的32位数字,这意味着您可以存储-2,147,483,648和2,147,483,647(含)之间的数字。

因此,如果您的long超出了int允许的值,则不会获得有价值的转换。

有关原始Java类型的大小的详细信息,请参见:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


1
在我看到该问题时,已经回答了该问题,但是未解释转换限制的主题。那我做了。如果您认为那是“ bla bla bla”,那仅意味着您是某种天才,可以不用那种东西,但是对于我们(仅是人类)来说,一个解释可能是有用的。谢谢您的“投入” ...
Alexis Dufrenoy

1

Java 8中,我按照以下方式进行操作

long l = 100L;
int i = Math.toIntExact(l);

ArithmaticException如果long值超出的范围,则抛出此方法int。因此,我可以避免数据丢失。


0

如果您想进行安全的转换并喜欢将Java8与Lambda表达式结合使用,则可以像下面这样使用它:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)

你的意思是说像Function<Long,Integer> function =吗?
Scratte

-1

长x = 3120L; //采用任何长值int z = x.intValue(); //您也可以用相同的方式将double转换为int

如果您需要直接隐蔽,则

longvalue.intvalue();


这是错误的,3.120不是一个长整数,它是一个双精度或浮点数。
乔治Xavier


-7

在Spring中,有一种严格的方法将long转换为int

不仅lnog可以将int转换为int,任何类型的扩展Number都可以将其转换为其他Number类型,通常,这里我将向您展示如何将long转换为int,反之亦然。

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

将long转换为int


6
Spring可能是Java,但Java不是Spring。“在Java中,”是一个错误的语句。
Gordon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.