6 November 2026•baca 5 menit

Operator Java: Rata-Rata yang Keluar Sebagai Bilangan Bulat

Tiga nilai, satu pembagian, dan rata-ratanya tercetak 82. Kedua operand-nya int, jadi pecahannya dipotong, dan cast yang paling wajar malah mencetak 82.0 tanpa memperbaiki apa pun.

Baca dalam bahasa Inggris

Kamu menjumlahkan tiga nilai ujian, membaginya dengan tiga, lalu mencetak hasilnya. Program mencetak 82, padahal angka yang seharusnya keluar adalah 82,33. Tidak ada error dan tidak ada peringatan. Compiler menerima semua barisnya, dan 82 adalah nilai yang masuk akal, itu sebabnya angka ini lolos.

Artikel ini hanya memakai satu file kecil: kamu akan meng-compile-nya, menjalankannya, melihat angka yang salah, mengubah satu hal, lalu menjalankannya lagi.

Poin Penting

  • int / int adalah pembagian bulat: pecahannya dipotong, bukan dibulatkan, jadi 247 / 3 adalah 82.
  • % mengembalikan bagian yang dibuang pembagian: 247 % 3 adalah 1.
  • Melakukan cast pada hasilnya ((double) (sum / count)) mencetak 82.0, karena pembagiannya sudah selesai di int.
  • Cast salah satu operand ((double) sum / count) untuk membagi dalam floating point dan mendapat 82.33333333333333.
  • double tidak bisa menampung setiap desimal, karena 0.1 + 0.2 adalah 0.30000000000000004, itu sebabnya uang memakai BigDecimal.
  • Input uji yang habis dibagi, seperti 246 dibagi 3, menyembunyikan bug ini di kedua versi.

Program yang mencetak 82

Simpan file ini sebagai Average.java. Isinya tiga nilai, penjumlahan di dalam loop, lalu jumlah itu dibagi panjang array.

JAVA
// Average.java
public class Average {
    public static void main(String[] args) {
        int[] scores = {80, 75, 92};
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        int average = sum / scores.length;
        System.out.println("sum: " + sum);
        System.out.println("average: " + average);
    }
}

Compile dan jalankan dengan dua perintah:

CONSOLE
javac Average.java
java Average

Hasilnya seperti ini:

TEXT
sum: 247
average: 82

Jumlahnya benar, karena 80 + 75 + 92 adalah 247. Rata-ratanya tidak, karena 247 / 3 adalah 82,33. Baris int average = sum / scores.length; terbaca seperti rumus di buku, jadi orang yang me-review melihat jumlah dibagi cacah data lalu lanjut. Output-nya bilangan bulat di rentang yang wajar. Tidak ada yang tampak rusak dari 82.

Apa yang dilakukan / kalau kedua sisinya int

JVM menentukan tipe hasil pembagian dari dua operand-nya. Di sini sum bertipe int dan scores.length juga int, jadi / melakukan pembagian bulat dan hasilnya int. Tipe int tidak punya ruang untuk pecahan, jadi pecahannya dibuang.

Dibuang tidak sama dengan dibulatkan. Pecahannya dipotong. 247 / 3 adalah 82, dan 5 / 2 adalah 2, padahal pembulatan akan memberimu 3. Angka 33 di belakang koma itu tidak pernah sampai ke program.

Operator % memberimu bagian yang tadi dibuang. 247 % 3 adalah 1: angka 3 masuk ke 247 sebanyak delapan puluh dua kali, dan tersisa 1. Gabungkan keduanya dan tidak ada yang hilang, karena 82 * 3 + 1 adalah 247.

Cast sebelum pembagian, bukan sesudahnya

Perbaikan yang paling kelihatan benar adalah meminta double. Ubah barisnya jadi seperti ini:

double average = (double) (sum / scores.length);

Baris ini lolos compile tanpa peringatan dan mencetak 82.0. Bentuknya double, dan double terlihat presisi, tapi itu bukan rata-ratanya. Tanda kurung membuat pembagiannya berjalan lebih dulu, di int, dan hasilnya 82. Cast-nya baru kemudian melebarkan 82 menjadi 82.0. Kerusakannya sudah terjadi sebelum cast mendapat giliran.

Cast-nya harus menempel pada operand: (double) sum / scores.length. Cast mengikat lebih kuat daripada /, jadi sum berubah jadi double lebih dulu. Dengan satu double di sisi kiri, Java melebarkan operand lainnya supaya cocok lalu membagi dalam floating point. Hasilnya 82.33333333333333.

Berikut file yang sudah diperbaiki. Tipe average diganti, cast-nya dipindah ke sum, dan ada satu baris tambahan yang mencetak sisa pembagian tadi.

JAVA
// Average.java
public class Average {
    public static void main(String[] args) {
        int[] scores = {80, 75, 92};
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        double average = (double) sum / scores.length;
        System.out.println("sum: " + sum);
        System.out.println("average: " + average);
        System.out.println("remainder: " + sum % scores.length);
    }
}

Jalankan dua perintah yang sama:

TEXT
sum: 247
average: 82.33333333333333
remainder: 1

Prioritas operator dan sisanya

Perkalian, pembagian, dan sisa bagi mengikat lebih kuat daripada penjumlahan dan pengurangan. Jadi 1 + 2 * 3 adalah 7, sementara (1 + 2) * 3 adalah 9. Tanda kurung mengubah operasi mana yang jalan lebih dulu. Bug cast tadi adalah kesalahan sejenis: urutan evaluasi Java yang menentukan jawabannya.

Pembagian bulat muncul juga di luar rata-rata. 10 / 3 adalah 3. Ubah satu operand jadi double dan 10.0 / 3 adalah 3.3333333333333335. Satu .0 di satu sisi mengubah bilangan bulat jadi pecahan panjang.

Lihat lagi dua hasil panjang tadi. 82.33333333333333 dan 3.3333333333333335 tidak berakhir seperti yang kamu tulis di kertas. Dari situ muncul satu hal yang tidak diselesaikan artikel ini.

Yang tidak dibahas di sini

double tidak bisa menampung setiap desimal dengan tepat. Ia menyimpan pecahan biner, dan nilai seperti 0,1 tidak punya bentuk biner yang pas. Jumlahkan dua di antaranya dan celahnya kelihatan: 0.1 + 0.2 adalah 0.30000000000000004.

Untuk uang, celah itu penting, dan Java punya BigDecimal untuk itu. Kita tidak memakainya di sini. Rata-rata nilai ujian bukan uang. Errornya jauh di belakang digit yang mungkin dipedulikan pembaca nilai, jadi double adalah alat yang tepat untuk program ini.

Sebelum artikel berikutnya

Ubah satu nilai supaya ketiganya berjumlah 246: pakai 80, 75, dan 91. Jalankan versi awal, lalu versi yang sudah diperbaiki. Ini yang saya ukur. Versi yang memotong pecahan mencetak 82, dan versi ber-cast mencetak 82.0. Keduanya sepakat, dan tidak ada jawaban yang tampak salah, karena 246 habis dibagi 3.

Data yang habis dibagi menyembunyikan bug-nya. Tugasmu: jelaskan dengan kata-katamu sendiri kenapa bug itu kembali begitu jumlahnya tidak habis dibagi cacah data.

Kalau satu hasil terlihat benar di satu input, input mana yang akan membuatnya salah?

Biar makin jago ngoding.

Yuk gabung bareng temen-temen developer lainnya buat dapet update teknologi, tips, dan tutorial santai tiap minggu.

Biar Nggak Kudet

Update teknologi, tips ngoding, dan insight santai langsung ke email kamu tiap minggu.

Santai, anti spam. Bisa berhenti langganan kapan aja.

Baca Selanjutnya

Lihat semua
PythonModul Python: Import yang Mencetak Laporannya

Kamu memindahkan satu fungsi ke file sendiri, meng-import-nya, dan seluruh laporan jalan lagi lalu memakan inputmu. Modul adalah file, import menjalankannya dari atas ke bawah, dan satu baris menentukan pekerjaan mana yang sedang dijalankan file itu.

Untuk developer yang belajar dari kesulitan

© 2026 Inva.dev.