#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)
的方法long
和int
。评论
无需使用库
–希腊
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
– 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
评论
在Java中将long安全地强制转换为int的可能副本