Javaでlongをintに変換するにはどうすればよいですか?


回答:


371

Java 8で更新:

Math.toIntExact(value);

元の答え:

単純型キャストはそれを行うべきです:

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

ただし、大きな数値(通常はより大きい2147483647、小さい-2147483648)は一部のビットを失い、正しく表現されないことに注意してください。

たとえば、2147483648はと表され-2147483648ます。


整数の精度はどれくらいですか?o_O
khachik

3
@khachik私は精度が1か:)もちろん多分42だと思う
extraneon

7
キャスティングは、オブジェクトとプリミティブ型の意味が異なります。(int)lは64ビット整数を32ビット整数として処理しようとせず、実際には同じ下位32ビットの異なる32ビット整数を返します。オブジェクトでは、より具体的な子クラスにキャストしますが、特権型では、キャストは実際にはキャストではなく、変換です。
dspyz

Int x =(int)(((Long)Integer.MAX_INTEGER)+10); この場合、変換でxの値が不適切であることが検出されない場合、解決策はありません。
レイザーコスタン2013

Math.toIntExact()は実際には素晴らしいメソッドです。値が大きすぎてintに収まらない場合は、例外がスローされます。提案をありがとう。
java-addict301

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


3
これが最善の方法だと思います。
Simmant 2017

この方法と単に値をキャストするだけの違いは何ですか?私が思うに、intValue()ここでバックグラウンドで行われていることはすべて、値をキャストすることだと思います。
TimWißmann、2018年

1
タイプに注意してください。longここではプリミティブではありません。Longプリミティブに直接キャストできない参照型intです。int y = (int)x;例外をスローしますが、int y = (int)(long)x機能します。(理由はオートボクシングです)
akop '14年

58

小さな値の場合、キャストで十分です:

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

ただし、a 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

マイナス記号に注意してくださいyxInteger.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が述べた事実。
レイザーコスタン2013

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

Guavaライブラリを使用している場合Ints.checkedCast(long)Ints.saturatedCast(long)に変換longする方法と方法がありintます。


4
ライブラリを使用する必要はありません
Grekz 2013年

6
OP次第である@Grekz。この場合、私はそうします。より多くの依存性jarを持たないという実際の理由がない限り、より多くの依存性jarはより多くの再発明されたホイールよりも優れています。
djechlin 2013

1
私見、この答えは受け入れられた答えよりもはるかに優れています。
Mark Slater

5
私のプロジェクトにはすでにそのjarが含まれているので、新しいヘルパーを作成するよりもそれを使用する方が利点があります
Osify

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

しかし、それはをlongとして表すことができると想定していますがint、2つの違いを知っていますか?


6
知っておくと興味深いのは、java.sun.com / docs / books / jls / third_edition / html /…(Java言語仕様)のパラメーター5.1.3によると、オーバーフロー、アンダーフロー、またはその他の情報の損失がプリミティブ型間の変換を狭めると、実行時例外は発生しません(§11)。
extraneon

19

プリミティブのLong代わりにラッパーを使用してlong呼び出すことができます

Long.intValue()

Java7 intValue()ドキュメント

これlongは、に収まるように値を丸めるか切り捨てますint


現在のドキュメントにリンクし、これを拡張することをお勧めします。必然的に、longをintに変換するときにある程度の丸めが行われます。

2
Long.intValue()のJava 7実装を見ると、キャストしているだけです。アンダー/オーバーフローチェックは実装されていません。したがって、少なくともJava 7では、このオプションは(int)someLongと同等です。
buzz3791 2013年

なぜ賛成投票が少ないのですか?私が最も貴重な回答のひとつ見つかった
アナンドjを。カディ

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 2017年

1

ではJavaの8私は、次のように行います

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

このメソッドはArithmaticExceptionlong値がの範囲を超えるとスローしますint。したがって、私はデータ損失から安全です。


0

安全な変換を行い、ラムダ式でJava8を使用したい場合は、次のように使用できます。

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

あなたはそれを次のように宣言することを意味しFunction<Long,Integer> function =ますか?
スクラッチ

-1

長いx = 3120L; //任意の長い値を取るint z = x.intValue(); //同じ方法でdoubleをintに変換できます

直接隠蔽する必要がある場合

longvalue.intvalue();


これは間違っています。3.120は長くはなく、倍精度浮動小数点数です。
ジョージザビエル


-7

Springでは、longをintに変換する厳密な方法があります

lnogが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ではありません。「ジャワにはある」というのは虚偽のことです。
ゴードン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.