Cast Double ke Integer di Java

348

Ada cara untuk java.lang.Doublemelakukan java.lang.Integer?

Itu melempar pengecualian

"java.lang.ClassCastException: java.lang.Double tidak kompatibel dengan java.lang.Integer"

4lex1v
sumber

Jawaban:

464

A Doublebukan Integer, jadi para pemain tidak akan bekerja. Perhatikan perbedaan antara Double kelas dan double primitif . Perhatikan juga bahwa a Doubleadalah a Number, sehingga memiliki metode intValue , yang dapat Anda gunakan untuk mendapatkan nilai sebagai primitif int.

hvgotcodes
sumber
2
Ok untuk tidak melakukan casting. Saya perlu mendapatkan objek Integer dari Double, bukan 13.22222 tetapi 13, misalnya.
4lex1v
181
panggil saja intValue().
hvgotcodes
6
Jangan lupa untuk menangani nulls.
pimlottc
13
Perhatikan bahwa ini hanya mengembalikan bagian integer dari Double, jadi untuk 13.666667 atau bahkan 13.9, Anda akan mendapatkan 13, bukan 14. Jika Anda menginginkan integer terdekat , lihat jawaban saya: stackoverflow.com/a/24816336/1450294
Michael Scheper
2
jika Anda melihat implementasi intValue(), itu hanya melemparkan doubleke int.
carlo.marinangeli
566

Anda perlu secara eksplisit mendapatkan nilai int menggunakan metode intValue () seperti ini:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Atau

double d = 5.25;
int i = (int) d;
anubhava
sumber
67
Terima kasih. Sangat jelas. Jawaban yang diterima, bagi saya, terasa seperti dimarahi karena mengajukan pertanyaan konyol. Tetapi jawaban Anda sangat murah hati.
Buddhika Ariyaratne
2
Apa yang terjadi ketika nilai ganda berada di luar rentang integer? (seperti 2 ^ 33)
nikdeapen
5
Nilai ganda> apa pun 2^31 - 1 (Integer.MAX_VALUE)akan meluap.
anubhava
3
Dan, omong-omong, ketika dilemparkan dari dobel ke int, itu hanya membuat bagian integer, untuk angka positif & negatif, dan tidak peduli tentang pembulatan. misalnya 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
Eric Wang
51

Saya pikir tidak mungkin untuk memahami jawaban lain tanpa menutupi perangkap dan alasannya di baliknya.

Anda tidak dapat secara langsung melemparkan sebuah Integerke Doubleobjek. Juga DoubledanInteger merupakan objek yang tidak dapat diubah, sehingga Anda tidak dapat memodifikasinya dengan cara apa pun.

Setiap kelas numerik memiliki alternatif primitif ( Doublevs double, Integervs int, ...). Perhatikan bahwa primitif ini dimulai dengan karakter huruf kecil (mis int.). Itu memberitahu kita bahwa mereka bukan kelas / objek. Yang juga berarti mereka tidak memiliki metode. Sebaliknya, kelas (misalnya Integer) bertindak seperti kotak / pembungkus di sekitar primitif ini, yang memungkinkan untuk menggunakannya sebagai objek.

Strategi:

Untuk mengonversi a Doublemenjadi IntegerAnda harus mengikuti strategi ini:

  1. Ubah Doubleobjek menjadi primitif double. (= "unboxing")
  2. Ubah primitif doublemenjadi primitif int. (= "casting")
  3. Konversi primitif intkembali ke Integerobjek. (= "tinju")

Dalam kode:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

Sebenarnya ada jalan pintas. Anda dapat segera menghapus kotak dari Doublelangsung ke primitif int. Dengan begitu, Anda dapat melewati langkah 2 seluruhnya.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

Perangkap:

Namun, ada banyak hal yang tidak tercakup dalam kode di atas. Kode di atas bukan nol-aman.

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

Sekarang berfungsi dengan baik untuk sebagian besar nilai. Namun bilangan bulat memiliki rentang yang sangat kecil (nilai min / maks) dibandingkan dengan a Double. Selain itu, ganda juga bisa menampung "nilai khusus", yang tidak bisa:

  • 1/0 = + tak terbatas
  • -1/0 = -infinity
  • 0/0 = tidak terdefinisi (NaN)

Jadi, tergantung pada aplikasinya, Anda mungkin ingin menambahkan beberapa pemfilteran untuk menghindari Pengecualian yang buruk.

Kemudian, kelemahan selanjutnya adalah strategi pembulatan. Secara default, Java akan selalu dibulatkan ke bawah. Membulatkan ke bawah masuk akal dalam semua bahasa pemrograman. Pada dasarnya Java hanya membuang beberapa byte. Dalam aplikasi keuangan Anda pasti ingin menggunakan pembulatan setengah-atas (misalnya: round(0.5) = 1dan round(0.4) = 0).

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

Otomatis (un) tinju

Anda bisa tergoda untuk menggunakan tinju otomatis (tidak) dalam hal ini, tapi saya tidak mau. Jika Anda sudah terjebak sekarang, maka contoh-contoh selanjutnya juga tidak akan terlalu jelas. Jika Anda tidak mengerti cara kerja dalam dari tinju otomatis maka jangan gunakan.

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

Saya kira yang berikut ini seharusnya tidak mengejutkan. Tetapi jika ya, maka Anda mungkin ingin membaca beberapa artikel tentang casting di Jawa.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

Lebih suka nilai:

Juga, jangan tergoda untuk menggunakan new Integer()konstruktor (karena beberapa jawaban lain mengusulkan). The valueOf()metode yang lebih baik karena mereka menggunakan caching. Merupakan kebiasaan yang baik untuk menggunakan metode ini, karena dari waktu ke waktu mereka akan menghemat sedikit memori.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
bvdb
sumber
1
ini menurut saya adalah jawaban terbaik
Thor
39

Saya melihat tiga kemungkinan. Dua yang pertama memotong digit, yang terakhir putaran ke Integer terdekat.

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10
squit
sumber
21
Tidak perlu untuk Integer.value Jika Anda akan menyimpan hasilnya dalam int primitif. Kode Anda memaksa Java untuk melakukan kotak dan kotak yang tidak perlu.
bvdb
23

Seperti ini:

Double foo = 123.456;
Integer bar = foo.intValue();
Richard Schwartz
sumber
23

Memang, cara paling sederhana adalah menggunakan intValue(). Namun, ini hanya mengembalikan bagian integer; tidak melakukan pembulatan. Jika Anda ingin Integer terdekat dengan nilai Double, Anda harus melakukan ini:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

Dan jangan lupa kasus nol:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() menangani kasus bebek aneh, seperti tak terbatas dan NaN, dengan rahmat yang relatif.

Michael Scheper
sumber
2
Mengapa Anda memerlukan Integer.valueOf jika Anda memberikan hasil Math.round ke int?
Eran H.
@RanH .: Pada Java 1.5, Anda mungkin tidak — autoboxing berarti kode tersebut kemungkinan berakhir dengan melakukan hal yang sama. Tapi saya pikir kode ini lebih jelas untuk orang-orang yang belum cukup memahami objek dan primitif.
Michael Scheper
Siapa pun yang menolak pilihan ini: Anda akan banyak membantu komunitas jika Anda menjelaskan alasannya, dan bahkan mungkin membantu Anda mengetahui mengapa itu tidak berhasil untuk Anda. Pemungutan suara tanpa penjelasan, OTOH, tidak membantu bagi semua orang, dan itu dianggap sebagai pengecut.
Michael Scheper
14
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
conflittimat
sumber
2
Pertanyaannya secara khusus tentang kelas pembungkus. Jawaban ini tentang primitif.
Michael Scheper
8

Lakukan saja dengan cara ini ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Sunil Sharma
sumber
7
Double d = 100.00;
Integer i = d.intValue();

Orang juga harus menambahkan bahwa ia bekerja dengan autoboxing.

Jika tidak, Anda mendapatkan int (primitif) dan kemudian bisa mendapatkan Integer dari sana:

Integer i = new Integer(d.intValue());
manocha_ak
sumber
2
Jangan gunakan new Integer(int), sebaliknya gunakan Integer.valueOf(int), yang memiliki cache untuk bilangan bulat kecil, seperti ini.
bvdb
6

Panggil objek intValue()Anda Double.

Alejandro Pablo Tkachuk
sumber
1
Sepertinya pengulangan dari jawaban sebelumnya.
Pang
4

Anda dapat melakukannya dengan menggunakan "Konversi tipe sempit atau Eksplisit", gandakan → panjang → int. Saya harap ini akan berhasil.

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

PS: Ini akan memberikan 0 sebagai ganda memiliki semua nilai desimal dan tidak ada di sisi kiri. Dalam hal 0,58, itu akan mempersempitnya menjadi 0. Tetapi bagi orang lain itu akan melakukan keajaiban.

Sarthak Bhatia
sumber
4

Coba yang ini

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Samantha de Silva
sumber
3

Double dan Integer adalah kelas wrapper untuk primitif Java untuk double dan int. Anda bisa memilih di antara itu, tetapi Anda akan kehilangan titik mengambang. Yaitu, 5,4 dicor ke int akan menjadi 5. Jika Anda melemparkannya kembali, itu akan menjadi 5.0.

OnResolve
sumber
0

Cukup gunakan metode intValue dari Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
ravi ranjan
sumber
2
Sepertinya pengulangan dari jawaban lain.
Pang
0

Gunakan doubleNumber.intValue();metodenya.

PanTau
sumber
2
Sepertinya pengulangan dari jawaban lain.
Pang
-1

Memori efisien, karena akan berbagi contoh Double yang sudah dibuat.

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Pembayaran Ravinder
sumber
apakah ada alasan untuk itu Math.floor(...)? intValue()selalu lantai.
bvdb
-2

Ini berhasil untuk saya. Coba ini:

double od = Double.parseDouble("1.15");
int oi = (int) od;
Andrey Lychok Lychov-Podvala
sumber