Saya menulis kode ini:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
Hasilnya adalah 0. Mengapa ini, dan bagaimana cara mengatasi masalah ini?
sumber
Saya menulis kode ini:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
Hasilnya adalah 0. Mengapa ini, dan bagaimana cara mengatasi masalah ini?
Kedua operan (1 dan 3) adalah bilangan bulat, oleh karena itu aritmatika bilangan bulat (pembagian di sini) digunakan. Mendeklarasikan variabel hasil sebagai ganda hanya menyebabkan konversi implisit terjadi setelah pembagian .
Pembagian bilangan bulat tentu saja mengembalikan hasil sebenarnya dari pembagian yang dibulatkan menuju nol. Hasil dari 0.333...
demikian dibulatkan menjadi 0 di sini. (Perhatikan bahwa prosesor sebenarnya tidak melakukan pembulatan apa pun, tetapi Anda masih dapat menganggapnya seperti itu.)
Juga, perhatikan bahwa jika kedua operan (angka) diberikan sebagai float; 3.0 dan 1.0, atau bahkan hanya yang pertama , kemudian aritmatika floating-point digunakan, memberi Anda 0.333...
.
int i = .99999999
set int ke 0. Lebih khusus lagi, ia mengambil bagian integer dan membuang sisanya.DOWN
mengarah ke nol. PembulatanFLOOR
menuju tak terhingga negatif.1/3
menggunakan pembagian integer karena kedua sisi adalah bilangan bulat.Anda membutuhkan setidaknya satu dari mereka untuk menjadi
float
ataudouble
.Jika Anda memasukkan nilai dalam kode sumber seperti pertanyaan Anda, Anda dapat melakukannya
1.0/3
; itu1.0
adalah ganda.Jika Anda mendapatkan nilai dari tempat lain, Anda dapat menggunakan
(double)
untuk mengubahnyaint
menjadidouble
.sumber
Transmisikan secara eksplisit sebagai
double
Ini terjadi karena Java menggunakan operasi pembagian integer untuk
1
dan3
karena Anda memasukkannya sebagai konstanta integer.sumber
kamu harus menggunakan
atau
Divisi integer mengembalikan integer.
sumber
Karena Anda melakukan pembagian integer.
Seperti yang dikatakan @Noldorin, jika kedua operator adalah bilangan bulat, maka pembagian bilangan bulat akan digunakan.
Hasil 0,3333333 tidak dapat direpresentasikan sebagai bilangan bulat, oleh karena itu hanya bagian bilangan bulat (0) yang ditetapkan ke hasil.
Jika salah satu operator adalah a
double
/float
, maka aritmatika floating point akan dilakukan. Tetapi Anda akan memiliki masalah yang sama jika Anda melakukannya:sumber
Karena itu memperlakukan 1 dan 3 sebagai bilangan bulat, oleh karena itu membulatkan hasilnya ke 0, sehingga itu adalah bilangan bulat.
Untuk mendapatkan hasil yang Anda cari, beri tahu java secara eksplisit bahwa jumlahnya berlipat ganda seperti:
sumber
Buatlah 1 menjadi float dan divisi float akan digunakan
sumber
Konversi di JAVA cukup sederhana tetapi membutuhkan pemahaman. Seperti yang dijelaskan di JLS untuk operasi integer :
Dan contoh selalu merupakan cara terbaik untuk menerjemahkan JLS;)
Contoh kecil menggunakan Eclipse untuk menunjukkan bahwa penambahan dua
short
pun tidak akan semudah itu:Ini akan membutuhkan pengecoran dengan kemungkinan hilangnya presisi.
Hal yang sama berlaku untuk operator floating point
Jadi promosi dilakukan di float menjadi double.
Dan campuran bilangan bulat dan nilai mengambang menghasilkan nilai mengambang seperti yang dikatakan
Ini berlaku untuk operator biner tetapi tidak untuk "Operator Penugasan" seperti
+=
Contoh kerja sederhana sudah cukup untuk membuktikan ini
Alasannya adalah bahwa ada pemeran implisit yang dilakukan di sini, ini akan dieksekusi seperti
sumber
1 dan 3 adalah kontan integer sehingga Java melakukan pembagian integer yang hasilnya 0. Jika Anda ingin menulis konstanta ganda, Anda harus menulis
1.0
dan3.0
.sumber
Solusi termudah adalah dengan melakukan ini
Apa yang dilakukannya, karena Anda tidak memasukkan 1.0 / 3.0, adalah memungkinkan Anda mengonversinya secara manual ke tipe data ganda karena Java menganggapnya sebagai divisi Integer, dan itu akan melakukannya bahkan jika itu berarti mempersempit konversi. Inilah yang disebut operator cor.
sumber
Saya melakukan ini.
Gunakan .0 saat melakukan kalkulasi ganda atau Java akan menganggap Anda menggunakan Integer. Jika Perhitungan menggunakan sejumlah nilai ganda, maka outputnya akan menjadi nilai ganda. Jika semuanya adalah Integer, maka outputnya adalah Integer.
sumber
(1/3) berarti pembagian bilangan bulat, oleh karena itu Anda tidak bisa mendapatkan nilai desimal dari pembagian ini. Untuk mengatasi masalah ini gunakan:
sumber
Karena 1 dan 3 adalah int, hasilnya tidak dibulatkan tetapi dipotong. Jadi Anda mengabaikan pecahan dan hanya mengambil keseluruhan.
Untuk menghindari hal ini, miliki setidaknya satu dari angka 1 atau 3 sebagai bentuk desimal 1.0 dan / atau 3.0.
sumber
Coba ini:
sumber
Lakukan "double g = 1.0 / 3.0;" sebagai gantinya.
sumber
Banyak orang lain yang gagal menunjukkan masalah sebenarnya:
Ini berarti bahwa hasil titik mengambang, yang dapat ditampilkan sebagai bilangan bulat, akan dipotong (hilangkan bagian desimal).
Apa casting (typecasting / konversi jenis) yang Anda tanyakan?
Ini bervariasi pada penerapan bahasanya, tetapi Wikipedia memiliki pandangan yang cukup komprehensif, dan itu berbicara tentang paksaan juga, yang merupakan bagian informasi penting dalam menjawab pertanyaan Anda.
http://en.wikipedia.org/wiki/Type_conversion
sumber
1/2
, tidak dalam bahasa target (java). Anda cukup memanggil pembagian integer, yang akan menghasilkan hasil integer. Type Casting hanya karena konversi dariint
ke adouble
selama penugasan.0.5
. Sederhananya, di Jawa,1/2
adalah pembagian integer, yang menghasilkan integer nol. Anda dapat menetapkan nol menjadi ganda, itu akan tetap menjadi nol, meskipun menjadi0.0
ganda.