Membulatkan ganda untuk mengubahnya menjadi int (java)

119

Sekarang saya mencoba ini:

int a = round(n);

di mana na doubletetapi tidak berfungsi. Apa yang saya lakukan salah?

David
sumber
kemungkinan duplikat stackoverflow.com/questions/153724/…
Matt Ball
6
Anda harus benar-benar menjelaskan "tidak berfungsi" secara lebih rinci. Apa yang terjadi? Apa yang tidak terjadi? Apa yang kamu harapkan? Kesalahan apa yang Anda dapatkan? Apakah Anda memiliki round()metode di kelas yang sama? Benarkah import static java.lang.Math.*? Dll .. Ada banyak cara untuk membulatkan angka dan dengan demikian juga banyak kemungkinan jawaban. Dengan kata lain, pertanyaan Anda tidak jelas dan ambigu dan tidak dapat dijawab secara wajar dalam bentuknya saat ini. Ini menembak dalam kegelapan.
BalusC
1
Apakah "tidak berfungsi" berarti tidak membulatkan ke int terdekat, atau mengeluarkan pengecualian, atau tidak membulatkan ke atas / ke bawah? Pertanyaan ini tidak berguna tanpa harus merujuksilangkan konteks dengan jawabannya.
modulitos

Jawaban:

239

Apa jenis kembalian round()metode dalam cuplikan?

Jika ini adalah Math.round()metodenya, ia mengembalikan Long ketika parameter inputnya adalah Double.

Jadi, Anda harus memberikan nilai pengembalian:

int a = (int) Math.round(doubleVar);
Mihir Mathuria
sumber
1
Pertimbangkan untuk menggunakan Math.toIntExact (long) daripada hanya mentransmisikan ke int; dobel dapat menampung cukup banyak nilai dan Anda mungkin tidak ingin diam-diam membuang bit paling signifikan jika kembaran Anda lebih besar dari yang Anda harapkan.
othp
Saya percaya pemeran tidak perlu. Saya tidak tahu apakah itu di masa lalu, tetapi putaran tidak mengembalikan int.
Putus
@Dropout Math.round mengembalikan int jika Anda memberikan pelampung, dan panjang jika Anda memberikannya ganda.
Tur1ng
27

Jika Anda tidak menyukai Math.round () Anda dapat menggunakan pendekatan sederhana ini juga:

int a = (int) (doubleVar + 0.5);
Dr. Daniel Thommes
sumber
4
Jelas tidak ada alasan berharga untuk tidak menyukai Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio
3
Solusi ini lebih pendek, tidak perlu diimpor dan mudah dibawa ke banyak bahasa pemrograman lain dengan sedikit perubahan. Dan bahkan mungkin lebih cepat tergantung pada platform Anda: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes
1
Saya tidak mengkritik jawaban Anda, yang menurut saya sangat berguna untuk alasan yang Anda sebutkan. Saya, dengan komentar ini, menyapa orang-orang yang takut untuk menggunakan Math.round(), yang secara "harfiah" sama dengan solusi yang Anda berikan, itu saja. Bersulang.
Gauthier Boaglio
2
Ya, seperti yang dikatakan nehz, saya yakin ini akan membulatkan -2,1 menjadi -1, misalnya.
Ben Aaronson
5
@AlbertoHormazabal, apakah Anda tidak memperhatikan bahwa dia menambahkan 0.5?
Sasha
11

Membulatkan dua kali lipat ke bilangan bulat "terdekat" seperti ini:

1.4 -> 1

1,6 -> 2

-2,1 -> -2

-1,3 -> -1

-1,5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

Anda dapat mengubah kondisi (hasil <0,5) sesuai keinginan.

valerybodak.dll
sumber
Saya setuju dengan jawaban anivaler. Tetapi jika Anda hanya perlu membulatkan ke bilangan bulat tertinggi, Anda bisa seperti di bawah ini: double decimalNumber = 4,56777; System.out.println (Float baru (Math.round (decimalNumber))); Hasil: 5
Smeet
3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}
Scott
sumber
3

Fungsi Math.round kelebihan beban Ketika menerima nilai float, itu akan memberi Anda int. Misalnya ini akan berhasil.

int a=Math.round(1.7f);

Ketika menerima nilai ganda, itu akan memberi Anda panjang, oleh karena itu Anda harus mengetikkannya ke int.

int a=(int)Math.round(1.7);

Ini dilakukan untuk mencegah hilangnya presisi. Nilai ganda Anda adalah 64bit, tetapi kemudian variabel int Anda hanya dapat menyimpan 32bit sehingga hanya mengubahnya menjadi panjang, yaitu 64bit tetapi Anda dapat mengetikkannya menjadi 32bit seperti yang dijelaskan di atas.

Divyansh Rai
sumber
1

Dokumentasi Math.roundmengatakan:

Menampilkan hasil pembulatan argumen menjadi bilangan bulat . Hasilnya setara dengan (int) Math.floor(f+0.5).

Tidak perlu melakukan cast ke int. Mungkin sudah berubah dari masa lalu.

penjahat-gamer
sumber
4
Ada 2 metode Math.round. Yang mengambil float mengembalikan integer, itu benar. Tapi yang membutuhkan dua kali lipat akan kembali lama.
Dominik Ehrenberg
0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}
Alexander Cyberman
sumber
-1

Anda benar-benar perlu memposting contoh yang lebih lengkap, sehingga kami dapat melihat apa yang Anda coba lakukan. Dari apa yang Anda posting, inilah yang dapat saya lihat. Pertama, tidak ada round()metode bawaan. Anda perlu memanggil Math.round(n), atau mengimpor secara statis Math.round, lalu memanggilnya seperti yang Anda lakukan.

Joey Gibson
sumber
Tidak ada fungsi global di java, sebagai permulaan.
Danon