mengubah ganda menjadi integer di java

114

Di Java, saya ingin mengubah double menjadi integer, saya tahu jika Anda melakukan ini:

double x = 1.5;
int y = (int)x;

Anda mendapatkan y = 1. Jika kamu melakukan ini:

int y = (int)Math.round(x);

Anda mungkin akan mendapatkan 2. Namun, saya bertanya-tanya: karena representasi ganda dari bilangan bulat terkadang terlihat seperti 1,9999999998 atau sesuatu, apakah ada kemungkinan bahwa casting ganda yang dibuat melalui Math.round () masih akan menghasilkan angka yang terpotong, bukan dari angka bulat yang kita cari (yaitu: 1 bukan 2 dalam kode seperti yang diwakili)?

(dan ya, aku berarti seperti itu: Apakah ada setiap nilai x, di mana y akan menunjukkan hasil yang merupakan terpotong daripada representasi bulat x?)

Jika ya: Apakah ada cara yang lebih baik untuk mengubah int yang membulat tanpa risiko pemotongan?


Figured sesuatu: Math.round (x) mengembalikan panjang, bukan ganda. Oleh karena itu: tidak mungkin Math.round () mengembalikan angka seperti 3.9999998. Oleh karena itu, int (Math.round ()) tidak perlu memotong apa pun dan akan selalu berfungsi.

vdMandele
sumber
6
Math.round (double) mengembalikan long, bukan double.
qbert220

Jawaban:

95

apakah ada kemungkinan bahwa casting ganda yang dibuat melalui Math.round()akan tetap menghasilkan angka yang terpotong

Tidak, round()akan selalu membulatkan penggandaan Anda ke nilai yang benar, dan kemudian, itu akan dilemparkan ke longyang akan memotong tempat desimal manapun. Tetapi setelah pembulatan, tidak akan ada bagian pecahan yang tersisa.

Ini dokumen dari Math.round(double):

Mengembalikan panjang terdekat ke argumen. Hasilnya dibulatkan menjadi bilangan bulat dengan menambahkan 1/2, mengambil lantai dari hasil, dan mentransmisikan hasilnya ke tipe panjang. Dengan kata lain, hasilnya sama dengan nilai ekspresi:

(long)Math.floor(a + 0.5d)
jjnguy
sumber
3
Poin pentingnya adalah bahwa pembulatan dilakukan dalam metode putaran. Nilai panjang dikembalikan, yang dapat dengan aman dilemparkan ke int (dengan asumsi nilai yang dikembalikan akan selalu berada dalam kisaran int).
qbert220
Iya. Tidak bisa membayangkan a / long / to int memberi masalah. Jelas! Seharusnya sudah memikirkan ini :(
vdMandele
1
Meskipun benar bahwa pemotongan tidak akan terjadi karena pembulatan, Anda masih mungkin tidak mendapatkan hasil yang diharapkan hanya karena casting dari double yang merupakan angka yang sangat besar [max double: 1.7976931348623157E308]ke int yang jauh lebih kecil [max int: 2147483647]. Hanya sesuatu yang perlu diingat.
Nelda.techspiress
22

Untuk tipe data Doubleke int, Anda dapat menggunakan berikut ini:

Double double = 5.00;

int integer = double.intValue();
Charlie
sumber
Dia mencari nilai yang bulat.
Marquis dari Lorne
1
Saya tidak berpikir itu akan memberikan apa yang Anda harapkan untuk 4,99999999999 (akan memberikan 4 bukan 5)
murkle
10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Memecahkan tujuan saya.

Nandkishor Gokhe
sumber