Bagaimana mengkonversi float ke int dengan Java


342

Saya menggunakan baris berikut untuk mengonversi float ke int, tetapi tidak seakurat yang saya inginkan:

 float a=8.61f;
 int b;

 b=(int)a;

Hasilnya adalah: 8(Seharusnya 9)

Kapan a = -7.65f, hasilnya adalah: -7(Seharusnya -8)

Apa cara terbaik untuk melakukannya?


16
Saya harus menunjukkan bahwa hanya typecasting yang memotong nilai dan tidak melakukan operasi pembulatan / lantai pada nilai.
Brian Graham

Jawaban:


678

Menggunakan Math.round()akan mengitari float ke integer terdekat.


1
mengapa typecast diperlukan setelah Math.round ()?
necromancer

81
Math.round()mengembalikan intnilai sehingga penggunaan typecasting (int)berlebihan.
Solvek

5
gunakan salah satu / atau ... (int)foolebih sederhana.
yuttadhammo

31
Jawaban Solvek benar, tetapi saya ingin menunjukkan bahwa Math.round () dapat memiliki dua tipe output yang berbeda berdasarkan input. Math.round (double a) mengembalikan panjang. Math.round (float a) mengembalikan int. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi

2
Math.round () adalah operasi yang lambat dibandingkan dengan casting ke (int)
darkgaze

186

Sebenarnya, ada beberapa cara untuk menurunkan float ke int, tergantung pada hasil yang ingin Anda capai: (untuk int i, float f)

  • round (bilangan bulat terdekat dengan float yang diberikan)

    i = Math.round(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -3

    catatan: ini, berdasarkan kontrak, sama dengan (int) Math.floor(f + 0.5f)

  • truncate (mis. jatuhkan semuanya setelah titik desimal)

    i = (int) f;
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
  • ceil / floor (bilangan bulat selalu lebih besar / lebih kecil dari nilai yang diberikan jika memiliki bagian fraksional)

    i = (int) Math.ceil(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  3 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
    i = (int) Math.floor(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -3 ; f = -2.68 -> i = -3

Untuk membulatkan nilai - nilai positif , Anda juga bisa menggunakan (int)(f + 0.5), yang berfungsi persis seperti Math.Rounddalam kasus tersebut (sesuai dok).

Anda juga dapat menggunakan Math.rint(f)untuk melakukan pembulatan ke bilangan bulat genap terdekat ; itu bisa dibilang berguna jika Anda berharap untuk berurusan dengan banyak pelampung dengan bagian fraksional sama dengan 0,5 (perhatikan kemungkinan masalah pembulatan IEEE), dan ingin mempertahankan rata-rata set di tempat; Anda akan memperkenalkan bias lain, di mana angka genap akan lebih umum daripada aneh.

Lihat

http://mindprod.com/jgloss/round.html

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html

untuk informasi lebih lanjut dan beberapa contoh.


rint adalah pembulatan bankir; ini membantu mengurangi kesalahan yang dapat muncul jika Anda secara konsisten membulatkan ke atas atau ke bawah.
prosfilaes

@prosfilaes Saya telah mengubah kata-kata & menambahkan tautan wiki ke bagian jawaban itu.

15

Math.round(value) bulatkan nilainya ke bilangan bulat terdekat.

Menggunakan

1) b=(int)(Math.round(a));

2) a=Math.round(a);  
   b=(int)a;

6

Math.round juga mengembalikan nilai integer, jadi Anda tidak perlu mengetik typecast.

int b = Math.round(float a);

14
Jawaban lain sudah mengatakan ini. Harap hanya tambahkan jawaban baru ketika Anda memiliki sesuatu yang baru untuk ditambahkan. (Juga, Math.round tidak mengembalikan int.)
Jeffrey Bosboom

1
Dia memberikan penjelasan tentang tidak perlu typecast (untuk jawaban Sachithra). Tetapi dapat dikonversi sebagai komentar.
Ranjith Kumar

5

Gunakan Math.round(value)kemudian setelah mengetikkan ke integer.

float a = 8.61f;
int b = (int)Math.round(a);

Math.round (float) mengembalikan int, saya tidak yakin mengapa para pemain ke int diperlukan
Nephilim

-1

Bagi saya, lebih mudah: (int) (a +.5) // a adalah Float. Kembalikan nilai bulat.

Tidak tergantung pada tipe Java Math.round ()


4
Ini akan membingungkan banyak pengembang yang menganalisis kode. Tidak akan jelas itu pembulatan.
ivan.panasiuk

1
Tentu saja, ini hanya matematika dasar, coba saja
Bruno L.

4
"Matematika dasar" adalah istilah relatif. :) Berdasarkan pengalaman saya, saya bisa bertaruh bahwa lebih dari 50% pengembang tidak akan mengerti bahwa ini benar-benar pembulatan. Secara matematis itu benar, tetapi ketika saya menulis, itu tidak jelas dan sulit bagi orang lain untuk memahami apa yang dilakukan oleh kode tersebut.
ivan.panasiuk

2
-(int) ( PI / 3 ): coba kode Anda dengan negatif a... sejak kapan -0.5sampai 0?

Anda benar jika angkanya negatif, Anda harus menambahkan -0.5
Bruno L.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.