Bagaimana saya bisa mengkonversi lama ke int di Jawa?


Jawaban:


371

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.


Apa ketepatan dari bilangan bulat? o_O
khachik

3
@khachik Saya pikir ketepatannya adalah 1. Atau mungkin 42 tentu saja :)
extraneon

7
Casting memiliki arti berbeda untuk objek dan untuk tipe primitif. (int) Saya tidak mencoba memperlakukan integer 64-bit sebagai integer 32-bit, ia sebenarnya mengembalikan integer 32-bit yang berbeda dengan 32 bit urutan yang lebih rendah. Dengan objek, Anda melakukan cast ke kelas anak yang lebih spesifik, tetapi dengan tipe primitif, cast bukanlah cast, tetapi konversi.
dspyz

Int x = (int) (((Panjang) Integer.MAX_INTEGER) +10); Jika konversi tidak mendeteksi dalam kasus ini bahwa x memiliki nilai yang tidak benar maka Anda tidak punya solusi.
raisercostin

Math.toIntExact () sebenarnya adalah metode yang hebat. Itu melempar dan pengecualian jika nilainya terlalu besar untuk muat di int. Terima kasih untuk sarannya.
java-addict301

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


3
Saya akan mengatakan ini akan menjadi cara terbaik.
Simmant

Apa perbedaan antara cara ini dan hanya sekadar memberikan nilainya? Saya pikir, semua yang intValue()dilakukan di sini di latar belakang adalah memberikan nilainya .. Benar?
Tim Wißmann

1
Perhatikan tipenya. Ini bukan primitif di 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)
akop

58

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 '


Jadi konversi yang tepat akan mendeteksi jika konversi itu aman dan melemparkan pengecualian. Fakta diutarakan oleh @Andrej Herich yang menyarankan perpustakaan Guava.
raisercostin

55

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;
}

37

Jika menggunakan perpustakaan Guava , ada metode Ints.checkedCast(long)dan Ints.saturatedCast(long)untuk mengkonversi longke int.


4
Tidak perlu menggunakan perpustakaan
Grekz

6
@ Grekz terserah OP. Saya akan dalam hal ini. Lebih banyak guci ketergantungan lebih baik daripada roda yang diciptakan kembali kecuali Anda memiliki alasan sebenarnya untuk tidak memiliki guci ketergantungan lebih banyak.
djechlin

1
IMHO, jawaban ini jauh lebih baik daripada yang diterima, karena tidak pernah melakukan sesuatu yang tidak terduga.
Mark Slater

5
Karena proyek saya sudah memasukkan toples itu, akan lebih bermanfaat untuk menggunakannya daripada menulis penolong baru
Osify

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

tetapi itu mengasumsikan bahwa longdapat direpresentasikan sebagai int, Anda tahu perbedaan antara keduanya?


6
Yang menarik untuk diketahui adalah bahwa sesuai dengan par 5.1.3 di java.sun.com/docs/books/jls/third_edition/html/… (The Java Language Spec): Terlepas dari kenyataan bahwa overflow, underflow, atau kehilangan informasi lainnya mungkin terjadi, penyempitan konversi di antara tipe primitif tidak pernah menghasilkan pengecualian run-time (§11).
extraneon

19

Anda dapat menggunakan Longpembungkus alih-alih longprimitif dan menelepon

Long.intValue()

Java7 intValue () docs

Itu membulatkan / memotong longnilai sesuai agar sesuai dengan int.


Mungkin ide yang baik untuk menautkan ke dokumentasi saat ini, serta memperluas ini - pasti, akan ada beberapa tingkat pembulatan saat mengkonversi panjang ke int.
Makoto

2
Melihat implementasi Java 7 dari Long.intValue (), itu hanya casting. Tidak ada pemeriksaan under / overflow yang diterapkan. Jadi setidaknya melalui Java 7, opsi ini setara dengan just: (int) someLong.
buzz3791

mengapa kurang upvotes? Saya menemukan ini salah satu Jawaban yang paling berharga
Anand j. Kadhi

3

Jika casting langsung menunjukkan kesalahan, Anda dapat melakukannya seperti ini:

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

2

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


1
Pertanyaan itu sudah dijawab pada saat saya melihatnya, tetapi subjek batas konversi tidak dijelaskan. Yang saya lakukan saat itu. Jika Anda berpikir itu "bla bla bla", itu hanya berarti Anda semacam jenius yang bisa pergi tanpa hal-hal semacam itu, tetapi bagi kami, manusia, penjelasan bisa berguna. Terima kasih atas "masukan" Anda ...
Alexis Dufrenoy

1

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.


0

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)

Maksudmu mendeklarasikannya seperti Function<Long,Integer> function =?
Scratte

-1

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 ();


Ini salah, 3.120 bukan panjang, itu angka dobel atau mengambang.
George Xavier


-7

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);

convert long ke int


6
Musim semi mungkin Jawa, tetapi Jawa bukan Musim Semi. "Di java, ada" adalah pernyataan yang salah.
Gordon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.