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

如何在Java中将long转换为int?,java,Java,如何在Java中将long转换为int long x = 3; int y = (int) x; 但是假设长的可以表示为int,您知道两者之间的区别吗?在Java8中更新: Math.toIntExact(value); 原始答案: Math.toIntExact(value); 简单类型铸造应做到这一点: long l = 100000; int i = (int) l; 但是,请注意,大的数字(通常大于2147483647且小于-2147483648)将丢失一些位,并将被错误地表示

如何在Java中将long转换为int

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

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

在Java8中更新:

Math.toIntExact(value);
原始答案:

Math.toIntExact(value);
简单类型铸造应做到这一点:

long l = 100000;
int i = (int) l;
但是,请注意,大的数字(通常大于
2147483647
且小于
-2147483648
)将丢失一些位,并将被错误地表示


例如,
2147483648
将表示为
-2147483648

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

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
保存的值大于
整数。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

在Java中,long是有符号的64位数字,这意味着您可以在-9223372036854775808和9223372036854775807(包括)之间存储数字

另一方面,int是有符号的32位数字,这意味着您可以在-2147483648和2147483647(包括)之间存储数字

因此,如果您的long超出了int允许的值,您将无法获得有价值的转换

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


您可以使用
Long
包装而不是
Long
原语并调用

Long.intValue()


它会相应地舍入/截断
long
值,以适合
int
如果使用,有一些方法可以将
long
转换为
int

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

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

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

自Java 8以来 您可以使用:Math.toIntExact(长值)

返回长参数的值;如果值溢出int,则引发异常

JDK 8中
Math.toIntExact
的源代码:

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

如果直接播放显示错误,您可以这样做:

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

Java8中,我按以下方式执行

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

如果
long
值超出
int
的范围,此方法将抛出
arithmatiception
。因此,我不会丢失数据

长x=3120L//多花点钱 intz=x.intValue()//也可以用同样的方法将double转换为int

如果你需要直接隐蔽的话


longvalue.intvalue()

如果您想进行安全转换并享受Java8与Lambda表达式的结合使用 您可以像这样使用它:

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

可以在此处进行手动打字:

long x1 = 1234567891;
int y1 = (int) x1;
System.out.println("in value is " + y1);

最短、最安全、最简单的解决方案是:

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
我也面临这个问题。 为了解决这个问题,我首先将long转换为String,然后转换为int

int i = Integer.parseInt(String.valueOf(long));

只要数字小于2147483647且没有错误,就可以将long转换为int。

整数的精度是多少?o_O@khachik我想精度是1。当然也可能是42:)Casting对于对象和基本类型有不同的含义。(int)l不尝试将64位整数视为32位整数,它实际上返回具有相同32个低阶位的不同32位整数。对于对象,可以强制转换为更具体的子类,但是对于primitve类型,强制转换实际上不是强制转换,而是转换。Int x=(Int)((Long)Integer.MAX_Integer)+10);在这种情况下,如果转换没有检测到x的值不正确,那么就没有解决方案。Math.toIntExact()实际上是一个很好的方法。如果值太大而不能适应INT,则抛出和异常。感谢这个建议。有趣的是,根据java语言规范中的PA5.5.3,尽管出现了溢出、下溢或其他信息丢失的事实,但在原始类型之间缩小转换不会导致运行时异常(第11节)。。链接到当前的文档并在此基础上进行扩展可能是一个好主意-在将long转换为int时不可避免地会有一定程度的舍入。查看long.intValue()的Java 7实现,这只是强制转换。未实施欠/溢出检查。所以,至少通过Java7,这个选项相当于:(int)someLong。为什么要少一些向上投票呢?我发现这是最有价值的答案之一,没有必要使用libraries@Grekz这取决于行动,在这种情况下我会的。更多的依赖性jar比重新发明的轮子要好,除非你有实际理由不使用更多的依赖性jar。IMHO,这个答案比公认的答案要好得多,因为它从来不会做意外的事情。因为我的项目已经包括了这个jar,使用它比编写新的帮助程序更有好处,因此正确的转换将是检测转换是否安全,否则抛出异常。@Andrej Herich提出了Guava库的建议。从Java8开始,您可以简单地使用Math.toIntExactSpring可能是Java,但Java不是Spring。“在java中,有”是一个错误的语句
int i = Integer.parseInt(String.valueOf(long));
long x;
int y;
y = (int) x