Ada cara untuk java.lang.Double
melakukan java.lang.Integer
?
Itu melempar pengecualian
"java.lang.ClassCastException: java.lang.Double tidak kompatibel dengan java.lang.Integer"
A Double
bukan Integer
, jadi para pemain tidak akan bekerja. Perhatikan perbedaan antara Double
kelas dan double
primitif . Perhatikan juga bahwa a Double
adalah a Number
, sehingga memiliki metode intValue
, yang dapat Anda gunakan untuk mendapatkan nilai sebagai primitif int
.
intValue()
.intValue()
, itu hanya melemparkandouble
keint
.Anda perlu secara eksplisit mendapatkan nilai int menggunakan metode intValue () seperti ini:
Atau
sumber
2^31 - 1 (Integer.MAX_VALUE)
akan meluap.1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,Saya pikir tidak mungkin untuk memahami jawaban lain tanpa menutupi perangkap dan alasannya di baliknya.
Anda tidak dapat secara langsung melemparkan sebuah
Integer
keDouble
objek. JugaDouble
danInteger
merupakan objek yang tidak dapat diubah, sehingga Anda tidak dapat memodifikasinya dengan cara apa pun.Setiap kelas numerik memiliki alternatif primitif (
Double
vsdouble
,Integer
vsint
, ...). Perhatikan bahwa primitif ini dimulai dengan karakter huruf kecil (misint
.). Itu memberitahu kita bahwa mereka bukan kelas / objek. Yang juga berarti mereka tidak memiliki metode. Sebaliknya, kelas (misalnyaInteger
) bertindak seperti kotak / pembungkus di sekitar primitif ini, yang memungkinkan untuk menggunakannya sebagai objek.Strategi:
Untuk mengonversi a
Double
menjadiInteger
Anda harus mengikuti strategi ini:Double
objek menjadi primitifdouble
. (= "unboxing")double
menjadi primitifint
. (= "casting")int
kembali keInteger
objek. (= "tinju")Dalam kode:
Sebenarnya ada jalan pintas. Anda dapat segera menghapus kotak dari
Double
langsung ke primitifint
. Dengan begitu, Anda dapat melewati langkah 2 seluruhnya.Perangkap:
Namun, ada banyak hal yang tidak tercakup dalam kode di atas. Kode di atas bukan nol-aman.
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: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) = 1
danround(0.4) = 0
).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.
Saya kira yang berikut ini seharusnya tidak mengejutkan. Tetapi jika ya, maka Anda mungkin ingin membaca beberapa artikel tentang casting di Jawa.
Lebih suka nilai:
Juga, jangan tergoda untuk menggunakan
new Integer()
konstruktor (karena beberapa jawaban lain mengusulkan). ThevalueOf()
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.sumber
Saya melihat tiga kemungkinan. Dua yang pertama memotong digit, yang terakhir putaran ke Integer terdekat.
sumber
Seperti ini:
sumber
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:Dan jangan lupa kasus nol:
Math.round()
menangani kasus bebek aneh, seperti tak terbatas dan NaN, dengan rahmat yang relatif.sumber
sumber
Lakukan saja dengan cara ini ...
sumber
Orang juga harus menambahkan bahwa ia bekerja dengan autoboxing.
Jika tidak, Anda mendapatkan int (primitif) dan kemudian bisa mendapatkan Integer dari sana:
sumber
new Integer(int)
, sebaliknya gunakanInteger.valueOf(int)
, yang memiliki cache untuk bilangan bulat kecil, seperti ini.Panggil objek
intValue()
AndaDouble
.sumber
Anda dapat melakukannya dengan menggunakan "Konversi tipe sempit atau Eksplisit", gandakan → panjang → int. Saya harap ini akan berhasil.
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.
sumber
Coba yang ini
sumber
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.
sumber
Cukup gunakan metode intValue dari Double
sumber
Gunakan
doubleNumber.intValue();
metodenya.sumber
Memori efisien, karena akan berbagi contoh Double yang sudah dibuat.
sumber
Math.floor(...)
?intValue()
selalu lantai.Ini berhasil untuk saya. Coba ini:
sumber