Lebih
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"
335
17
Anda perlu secara eksplisit mendapatkan nilai int menggunakan metode intValue() seperti ini:
Atau
Yang
Double
tidakInteger
, sehingga para pemain tidak't bekerja. Perhatikan perbedaan antaraDouble
hotel dandouble
primitif. Juga perhatikan bahwaDouble
adalahNomor
, sehingga memiliki metodeintValue
, yang dapat anda gunakan untuk mendapatkan nilai sebagai primitifint
.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
untukDouble
objek. JugaDouble
danbilangan Bulat
benda-benda yang tidak berubah, jadi anda tidak dapat memodifikasi mereka dengan cara apapun.Masing-masing numerik kelas memiliki primitif alternatif (
Double
vsganda
,Integer
vsint
, ...). Perhatikan bahwa primitif ini mulai dengan huruf kecil karakter (misalnyaint
). Yang memberitahu kita bahwa mereka tidak't kelas/objek. Yang juga berarti bahwa mereka don't memiliki metode. Sebaliknya, kelas (misalnyabilangan Bulat
) bertindak seperti kotak/pembungkus sekitar primitif ini, yang membuatnya mungkin untuk menggunakan mereka seperti benda-benda.Strategi:
Untuk mengkonversi
Double
untukInteger
, anda akan perlu untuk mengikuti strategi ini:Double
objek primitifganda
. (= "unboxing")double
untuk primitifint
. (= "casting")int
kembali keInteger
objek. (= "tinju")Kode:
Sebenarnya ada jalan pintas. Anda dapat unbox segera dari
Double
lurus ke primitifint
. Dengan cara itu, anda dapat melewatkan langkah 2 seluruhnya.Perangkap:
Namun, ada banyak hal-hal yang tidak tercakup dalam kode di atas. Kode di atas adalah not null aman.
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: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
danbulat(0.4) = 0
).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.
Saya kira sebagai berikut seharusnya't menjadi kejutan. Tapi jika ya, maka anda mungkin ingin membaca beberapa artikel tentang casting di pulau Jawa.
Sukai valueOf:
Juga, don't tergoda untuk menggunakan
new Integer()
konstruktor (seperti beberapa jawaban yang lain mengusulkan). ThevalueOf()
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.Saya melihat tiga kemungkinan. Dua yang pertama memotong digit, yang terakhir putaran ke Integer terdekat.
Seperti ini:
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:Dan don't lupa null kasus:
Matematika.round()
menangani aneh bebek kasus, seperti infinity dan NaN, dengan relatif rahmat.Hanya melakukannya dengan cara ini...
Satu juga harus menambahkan bahwa ia bekerja dengan autoboxing.
Jika tidak, anda mendapatkan int (primitif) dan kemudian bisa mendapatkan Integer dari sana:
Panggilan
intValue()
padaDouble
objek.Anda dapat melakukannya dengan menggunakan "Penyempitan atau Eksplisit konversi tipe", ganda → lama → int. Saya berharap ini akan bekerja.
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.
Coba yang satu ini
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.
Memori yang efisien, karena akan berbagi sudah dibuat contoh Ganda.
Gunakan
doubleNumber.intValue();
metode.Hanya menggunakan intValue metode Double
It's bekerja untuk saya. Coba ini: