Cast Double untuk bilangan Bulat di Jawa

Cara untuk cor jawa.lang.Double untuk jawa.lang.Integer?

Melempar pengecualian

"java.lang.ClassCastException: jawa.lang.Ganda tidak kompatibel dengan java.lang.Integer"

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;
Komentar (4)
Larutan

Yang Double tidak Integer, sehingga para pemain tidak't bekerja. Perhatikan perbedaan antara Double hotel dan double primitif. Juga perhatikan bahwa Double adalah Nomor, sehingga memiliki metode intValue, yang dapat anda gunakan untuk mendapatkan nilai sebagai primitif int.

Komentar (6)

Saya pikir itu's tidak mungkin untuk memahami jawaban lainnya tanpa menutupi perangkap dan penalaran di balik itu.

Anda tidak bisa langsung melemparkan sebuah Integer untuk Double objek. Juga Double dan bilangan Bulat benda-benda yang tidak berubah, jadi anda tidak dapat memodifikasi mereka dengan cara apapun.

Masing-masing numerik kelas memiliki primitif alternatif (Double vs ganda, Integer vs int, ...). Perhatikan bahwa primitif ini mulai dengan huruf kecil karakter (misalnya int). Yang memberitahu kita bahwa mereka tidak't kelas/objek. Yang juga berarti bahwa mereka don't memiliki metode. Sebaliknya, kelas (misalnya bilangan Bulat) bertindak seperti kotak/pembungkus sekitar primitif ini, yang membuatnya mungkin untuk menggunakan mereka seperti benda-benda.

Strategi:

Untuk mengkonversi Double untuk Integer, anda akan perlu untuk mengikuti strategi ini:

  1. Mengkonversi Double objek primitif ganda. (= "unboxing")
  2. Mengkonversi primitif double untuk primitif int. (= "casting")
  3. Mengkonversi primitif int kembali ke Integer objek. (= "tinju")

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 unbox segera dari Double lurus ke primitif int. Dengan cara itu, anda dapat melewatkan langkah 2 seluruhnya.

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

Perangkap:

Namun, ada banyak hal-hal yang tidak tercakup dalam kode di atas. Kode di atas adalah not null 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 bekerja dengan baik untuk sebagian besar nilai-nilai. Namun bilangan bulat memiliki rentang yang sangat kecil (min/max nilai) dibandingkan dengan a Ganda. Di atas semua itu, berfungsi juga dapat terus "nilai-nilai khusus", bahwa bilangan bulat tidak:

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

Jadi, tergantung pada aplikasi, anda mungkin ingin menambahkan beberapa penyaringan untuk menghindari Pengecualian jahat.

Kemudian, berikutnya kelemahan adalah pembulatan strategi. Secara default Jawa akan selalu putaran bawah. Pembulatan ke bawah masuk akal di semua bahasa pemrograman. Pada dasarnya Java hanya membuang beberapa byte. Dalam aplikasi keuangan anda pasti akan ingin menggunakan setengah-up pembulatan (misalnya: bulat(0.5) = 1 dan bulat(0.4) = 0).

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

Auto-(pbb)tinju

Anda bisa tergoda untuk menggunakan auto(un)tinju dalam hal ini, tapi saya tidak't. Jika anda're sudah terjebak sekarang, maka contoh berikutnya tidak akan menjadi seperti itu jelas tidak. Jika anda don't memahami cara kerja di dalam auto-(pbb)tinju maka silakan don't menggunakannya.

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 sebagai berikut seharusnya't menjadi kejutan. Tapi jika ya, maka anda mungkin ingin membaca beberapa artikel tentang casting di pulau Jawa.

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

Sukai valueOf:

Juga, don't tergoda untuk menggunakan new Integer() konstruktor (seperti beberapa jawaban yang lain mengusulkan). The valueOf() metode yang baik karena mereka menggunakan caching. It's kebiasaan yang baik untuk menggunakan metode ini, karena dari waktu ke waktu mereka akan menyelamatkan anda beberapa memori.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
Komentar (1)

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
Komentar (1)

Seperti ini:

Double foo = 123.456;
Integer bar = foo.intValue();
Komentar (0)

Memang, cara paling sederhana adalah dengan menggunakan intValue(). Namun, ini hanya mengembalikan bagian bilangan bulat; itu tidak melakukan pembulatan. Jika anda ingin Integer nearest untuk nilai Ganda, anda'll perlu melakukan hal ini:

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

Dan don't lupa null kasus:

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

Matematika.round() menangani aneh bebek kasus, seperti infinity dan NaN, dengan relatif rahmat.

Komentar (3)
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
Komentar (1)

Hanya melakukannya dengan cara ini...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Komentar (0)
Double d = 100.00;
Integer i = d.intValue();

Satu 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());
Komentar (1)

Panggilan intValue() pada Double objek.

Komentar (1)

Anda dapat melakukannya dengan menggunakan "Penyempitan atau Eksplisit konversi tipe", ganda → lama → int. Saya berharap ini akan bekerja.

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-nilai desimal dan tidak ada di sisi kiri. Dalam kasus 0.58, itu akan mempersempit ke 0. Tetapi untuk orang lain itu akan melakukan keajaiban.

Komentar (0)

Coba yang satu ini

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Komentar (0)

Ganda dan Integer adalah wrapper kelas untuk Jawa primitif untuk ganda dan int masing-masing. Anda dapat melemparkan di antara mereka, tetapi anda akan kehilangan floating point. Artinya, 5.4 dicor ke int akan menjadi 5. Jika anda melemparkan kembali, itu akan menjadi 5.0.

Komentar (0)

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

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Komentar (1)

Gunakan doubleNumber.intValue(); metode.

Komentar (1)

Hanya menggunakan intValue metode Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Komentar (1)

It's bekerja untuk saya. Coba ini:

double od = Double.parseDouble("1.15");
int oi = (int) od;
Komentar (0)