Jawaban:
Diperbarui, di Jawa 8:
Math.toIntExact(value);
Jawaban asli:
Pengecoran tipe sederhana harus melakukannya:
long l = 100000;
int i = (int) l;
Perhatikan, bagaimanapun, bahwa jumlah besar (biasanya lebih besar dari 2147483647dan lebih kecil dari -2147483648) akan kehilangan beberapa bit dan akan diwakili secara tidak benar.
Misalnya, 2147483648akan direpresentasikan sebagai -2147483648.
Long x = 100L;
int y = x.intValue();
intValue()dilakukan di sini di latar belakang adalah memberikan nilainya .. Benar?
longsini. Ini adalah jenis referensi Longyang tidak dapat langsung dilemparkan ke primitif int. int y = (int)x;akan melakukan eksekusi tetapi int y = (int)(long)xakan berfungsi. (Alasannya adalah autoboxing)
Untuk nilai kecil, casting sudah cukup:
long l = 42;
int i = (int) l;
Namun, longdapat menyimpan informasi lebih dari satu int, sehingga tidak mungkin untuk sempurna mengkonversi dari longke int, dalam kasus umum. Jika jumlah longmemegang kurang dari atau sama dengan Integer.MAX_VALUEAnda dapat mengubahnya dengan casting tanpa kehilangan informasi apa pun.
Misalnya, kode contoh berikut:
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);
menghasilkan output berikut di mesin saya:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
Perhatikan tanda negatif aktif y. Karena xmemiliki nilai yang lebih besar dari Integer.MAX_VALUE, int ytidak dapat menahannya. Dalam hal ini membungkus ke angka negatif.
Jika Anda ingin menangani sendiri kasus ini, Anda dapat melakukan sesuatu seperti:
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
Semua ini mengasumsikan angka positif. Untuk angka negatif, gunakan MIN_VALUEsebagai ganti `MAX_VALUE '
Karena Java 8 Anda dapat menggunakan: Math.toIntExact (nilai lama)
Lihat JavaDoc: Math.toIntExact
Mengembalikan nilai argumen panjang; melempar pengecualian jika nilainya melebihi int.
Kode sumber Math.toIntExactdalam JDK 8:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
Jika menggunakan perpustakaan Guava , ada metode Ints.checkedCast(long)dan Ints.saturatedCast(long)untuk mengkonversi longke int.
long x = 3;
int y = (int) x;
tetapi itu mengasumsikan bahwa longdapat direpresentasikan sebagai int, Anda tahu perbedaan antara keduanya?
Anda dapat menggunakan Longpembungkus alih-alih longprimitif dan menelepon
Long.intValue()
Itu membulatkan / memotong longnilai sesuai agar sesuai dengan int.
Jika casting langsung menunjukkan kesalahan, Anda dapat melakukannya seperti ini:
Long id = 100;
int int_id = (int) (id % 100000);
Di Jawa, panjang adalah angka 64 bit yang ditandatangani, yang berarti Anda dapat menyimpan angka antara -9.223.372.036.854.775.808 dan 9.222.372.036.854.775.780.807 (inklusif).
Int, di sisi lain, ditandatangani nomor 32 bit, yang berarti Anda dapat menyimpan nomor antara -2,147.483.648 dan 2.147.483.647 (inklusif).
Jadi, jika lama Anda di luar nilai yang diizinkan untuk int, Anda tidak akan mendapatkan konversi yang berharga.
Detail tentang ukuran tipe Java primitif di sini:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Di Java 8 saya lakukan dengan cara berikut
long l = 100L;
int i = Math.toIntExact(l);
Metode ini melempar ArithmaticExceptionjika longnilai melebihi kisaran int. Jadi saya aman dari kehilangan data.
Jika Anda ingin membuat konversi yang aman dan menikmati penggunaan Java8 dengan ekspresi Lambda Anda dapat menggunakannya seperti:
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
Function<Long,Integer> function =?
panjang x = 3120L; // ambil nilai lama int z = x.intValue (); // Anda dapat mengonversi dobel ke int juga dengan cara yang sama
jika Anda perlu secara rahasia maka langsung
longvalue.intvalue ();
Long l = 100;
int i = Math.round(l);
Di musim semi, ada cara yang ketat untuk mengkonversi panjang ke int
tidak hanya lnog yang dapat dikonversi menjadi int, semua tipe kelas extends Number dapat dikonversi ke tipe Number lainnya secara umum, di sini saya akan menunjukkan kepada Anda bagaimana mengkonversi panjang ke int, tipe lain sebaliknya.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);
