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

评论

在Java中将long安全地强制转换为int的可能副本

#1 楼

在Java 8中已更新:

Math.toIntExact(value);


原始答案:

简单类型转换应该做到:

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


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

例如,2147483648会表示为-2147483648

评论


整数的精度是多少? o_O

–卡其奇
2010-12-04 19:16

@khachik我认为精度是1。或者也许是42 :)

–extraneon
2010-12-04 19:22

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

–dspyz
2010-12-04 18:09

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

–raisercostin
13年2月22日在13:54



Math.toIntExact()实际上是一个很棒的方法。如果值太大而无法容纳在int中,则会引发异常。谢谢你的建议。

–java-addict301
19年5月22日在15:49



#2 楼

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




评论


我会说这是最好的方法。

–Simmant
17年3月3日在9:43

这种方式与仅投射值有什么区别?我认为,intValue()在后台执行的所有操作都在强制转换值。

– TimWißmann
18年1月28日在17:49

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

–akop
18年5月14日在8:48

#3 楼

对于较小的值,强制转换就足够了:
long l = 42;
int i = (int) l;

但是,long可以容纳比int更多的信息,因此在一般情况下不可能从long完美转换为int。如果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库。

–raisercostin
13年2月22日在13:57

#4 楼

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

请参阅JavaDoc:Math.toIntExact


返回long的值论据;


在JDK 8中Math.toIntExact的源代码:

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


#5 楼

如果使用Guava库,则存在将Ints.checkedCast(long)转换为Ints.saturatedCast(long)的方法longint

评论


无需使用库

–希腊
13年1月16日在19:29

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

–djechlin
13年8月19日在20:44

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

–马克·斯莱特(Mark Slater)
2014年12月2日上午11:07

由于我的项目已经包含了那个jar,因此使用它比编写一个新的帮助程序更有好处。

– Osify
15年6月17日在3:50

#6 楼

long x = 3;
int y = (int) x;


但是假设long可以表示为int,您知道两者之间的区别吗?

评论


有趣的是,根据java.sun.com/docs/books/jls/third_edition/html/…中的参数5.1.3:尽管存在上溢,下溢或其他信息丢失的事实,发生这种情况时,将原始类型之间的转换范围缩小不会导致运行时异常(第11节)。

–extraneon
2010-12-04 19:21

#7 楼

您可以使用Long包装器代替long原语,然后调用

Long.intValue()


Java7 intValue()docs

它相应地四舍五入/截断long值放入int中。

评论


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

– Makoto
2012年6月27日在1:57

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

–buzz3791
13-10-30在15:42



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

– Anand j。卡迪
17年4月18日在5:49

#8 楼

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

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


#9 楼

在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

评论


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

– Alexis Dufrenoy
17年1月17日在8:52

#10 楼

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

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


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

#11 楼

可以在此处进行手动类型转换:
long x1 = 1234567891;
int y1 = (int) x1;
System.out.println("in value is " + y1);


评论


请不要发表评论/问题。可以理解,您的代表太低而无法发表评论,但这并不意味着应使用答案来发表评论。如果您删除了它,那将是更好的选择。

–Clijsters
20年7月1日在19:02

#12 楼

最短,最安全,最简单的解决方案是:
long myValue=...;
int asInt = Long.valueOf(myValue).intValue();

请注意,Long.valueOf的行为是这样的:
使用此代码:
System.out.println("Long max: " + Long.MAX_VALUE);
System.out.println("Int max: " + Integer.MAX_VALUE);        
long maxIntValue = Integer.MAX_VALUE;
System.out.println("Long maxIntValue to int: " + Long.valueOf(maxIntValue).intValue());
long maxIntValuePlusOne = Integer.MAX_VALUE + 1;
System.out.println("Long maxIntValuePlusOne to int: " + Long.valueOf(maxIntValuePlusOne).intValue());
System.out.println("Long max to int: " + Long.valueOf(Long.MAX_VALUE).intValue());

结果为:
Long max: 9223372036854775807
Int max: 2147483647
Long max to int: -1
Long maxIntValue to int: 2147483647
Long maxIntValuePlusOne to int: -2147483648


#13 楼

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

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


评论


您是说像Function function =?一样声明它

– Scratte
20年5月31日在8:09

#14 楼

长x = 3120L; //采用任何长值
int z = x.intValue(); //如果您需要直接隐蔽,则也可以用同样的方法将double转换为int


longvalue.intvalue();

评论


这是错误的,3.120不是长整数,它是双精度或浮点数。

–乔治·泽维尔
19年7月23日在16:09

#15 楼

Long l = 100;
int i = Math.round(l);


#16 楼

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

不仅lnog可以将int转换为int,任何类型的扩展扩展Number都可以转换为其他Number类型,在这里我将向您展示

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




评论


Spring可能是Java,但Java不是Spring。 “在Java中,”是一个错误的语句。

–戈登
13年4月17日在17:58