0Pricing
Java Academy · Pelajaran

BigDecimal untuk Perhitungan Keuangan

Gunakan BigDecimal untuk menghindari kesalahan presisi bilangan pecahan dalam perhitungan uang dan pajak.

BigDecimal untuk Perhitungan Keuangan adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

BigDecimal untuk Perhitungan Keuangan

Tipe titik mengambang (double, float) tidak dapat merepresentasikan semua nilai desimal secara tepat karena representasi biner. Untuk uang dan pajak, gunakan BigDecimal.

Masalah Titik Mengambang

Titik mengambang biner menimbulkan galat pembulatan kecil. Dalam aplikasi keuangan, galat ini terakumulasi dan menyebabkan bug nyata.

double price = 0.1 + 0.2;
System.out.println(price);          // 0.30000000000000004 (WRONG!)
System.out.println(price == 0.3);   // false

// Real bug: total never equals expected
double total = 0;
for (int i = 0; i < 10; i++) total += 0.1;
System.out.println(total); // 0.9999999999999999

Membuat BigDecimal dengan Aman

Selalu buat BigDecimal dari String, bukan dari double. Penggunaan konstruktor double mewarisi ketidakpresisian titik mengambang.

import java.math.BigDecimal;

// WRONG: double constructor
BigDecimal wrong = new BigDecimal(0.1);
System.out.println(wrong); // 0.1000000000000000055511...

// CORRECT: String constructor
BigDecimal correct = new BigDecimal("0.1");
System.out.println(correct); // 0.1

// Or use valueOf (also safe)
BigDecimal safe = BigDecimal.valueOf(0.1);
System.out.println(safe); // 0.1

Aritmetika Dasar dengan BigDecimal

BigDecimal menggunakan pemanggilan metode untuk aritmetika: add(), subtract(), multiply(), divide(). Pemanggilan ini mengembalikan instans BigDecimal baru (tidak dapat diubah).

import java.math.BigDecimal;

BigDecimal price = new BigDecimal("19.99");
BigDecimal tax   = new BigDecimal("0.08");
BigDecimal qty   = new BigDecimal("3");

BigDecimal subtotal = price.multiply(qty);
BigDecimal taxAmount = subtotal.multiply(tax);
BigDecimal total = subtotal.add(taxAmount);

System.out.println(subtotal);  // 59.97
System.out.println(taxAmount); // 4.7976
System.out.println(total);     // 64.7676

Mode Pembulatan

RoundingMode mengontrol cara BigDecimal membulatkan nilai. Mode utama:

  • HALF_UP — pembulatan standar (0,5 dibulatkan ke atas)
  • HALF_EVEN — pembulatan bankir (0,5 dibulatkan ke bilangan genap terdekat)
  • DOWN — memotong menuju nol
  • CEILING — membulatkan menuju tak terhingga positif
import java.math.*;

BigDecimal val = new BigDecimal("2.565");

System.out.println(val.setScale(2, RoundingMode.HALF_UP));   // 2.57
System.out.println(val.setScale(2, RoundingMode.HALF_EVEN)); // 2.56 (banker's)
System.out.println(val.setScale(2, RoundingMode.DOWN));      // 2.56
System.out.println(val.setScale(2, RoundingMode.CEILING));   // 2.57

Pembagian dan Skala

Pembagian dengan BigDecimal mengharuskan Anda menentukan skala dan mode pembulatan untuk menghindari ArithmeticException pada desimal tak berhingga.

import java.math.*;

BigDecimal revenue = new BigDecimal("1000.00");
BigDecimal months  = new BigDecimal("3");

// Without scale → ArithmeticException (non-terminating decimal)
try {
    revenue.divide(months);
} catch (ArithmeticException e) {
    System.out.println("Need to specify scale!");
}

// Correct: specify scale and rounding
BigDecimal monthly = revenue.divide(months, 2, RoundingMode.HALF_UP);
System.out.println(monthly); // 333.33

Membandingkan BigDecimal

Gunakan compareTo() untuk membandingkan nilai, bukan equals(). equals() mempertimbangkan skala — 2,0 dan 2,00 TIDAK sama menurut equals(), tetapi SAMA menurut compareTo().

import java.math.BigDecimal;

BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("2.00");

System.out.println(a.equals(b));        // false (different scale)
System.out.println(a.compareTo(b));     // 0 (same value)
System.out.println(a.compareTo(b) == 0); // true

// For sorting in collections
import java.util.*;
List<BigDecimal> prices = Arrays.asList(
    new BigDecimal("3.50"), new BigDecimal("1.00"), new BigDecimal("2.75")
);
Collections.sort(prices);
System.out.println(prices); // [1.00, 2.75, 3.50]

MathContext untuk Digit Signifikan

MathContext menentukan presisi (digit signifikan) dan mode pembulatan. Gunakan ini ketika Anda memerlukan presisi digit signifikan yang konsisten, bukan jumlah tempat desimal.

import java.math.*;

MathContext mc = new MathContext(4, RoundingMode.HALF_UP);

BigDecimal a = new BigDecimal("1234567");
BigDecimal b = new BigDecimal("3");

BigDecimal result = a.divide(b, mc);
System.out.println(result); // 4.115E+5 (4 significant digits)

// DECIMAL32, DECIMAL64, DECIMAL128 are standard MathContexts
BigDecimal precise = new BigDecimal("355").divide(
    new BigDecimal("113"), MathContext.DECIMAL64);
System.out.println(precise); // 3.141592920353982...

Contoh Keranjang Belanja

Perhitungan keranjang belanja lengkap menggunakan BigDecimal: item baris, pajak, diskon, dan total akhir.

import java.math.*;

record LineItem(String name, BigDecimal price, int qty) {
    BigDecimal subtotal() {
        return price.multiply(new BigDecimal(qty));
    }
}

var items = List.of(
    new LineItem("Laptop",  new BigDecimal("999.00"), 1),
    new LineItem("Case",    new BigDecimal("29.99"),  2),
    new LineItem("Charger", new BigDecimal("49.99"),  1)
);

BigDecimal subtotal = items.stream()
    .map(LineItem::subtotal)
    .reduce(BigDecimal.ZERO, BigDecimal::add);

BigDecimal taxRate = new BigDecimal("0.09");
BigDecimal tax = subtotal.multiply(taxRate).setScale(2, RoundingMode.HALF_UP);
BigDecimal total = subtotal.add(tax);

System.out.println("Subtotal: " + subtotal);
System.out.println("Tax:      " + tax);
System.out.println("Total:    " + total);

Stripe: Mata Uang dalam Sen

Pemroses pembayaran seperti Stripe menyimpan jumlah sebagai sen bilangan bulat untuk sepenuhnya menghindari masalah desimal. Mengonversi antara sen dan jumlah yang ditampilkan adalah pola yang umum.

import java.math.*;

// Store as cents (long) for database / API
long amountCents = 999_99L; // $999.99

// Convert to BigDecimal for display
BigDecimal amount = BigDecimal
    .valueOf(amountCents)
    .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);

System.out.println("Amount: $" + amount); // Amount: $999.99

// Convert user input back to cents
BigDecimal input = new BigDecimal("49.95");
long cents = input.multiply(new BigDecimal("100"))
    .setScale(0, RoundingMode.HALF_UP).longValueExact();
System.out.println("Cents: " + cents); // Cents: 4995

Kapan Menggunakan BigDecimal atau double

Pilih tipe yang tepat untuk keperluan Anda:

  • BigDecimal: jumlah keuangan, pajak, faktur, ketika representasi desimal yang tepat diperlukan
  • double: perhitungan ilmiah, grafika, ML — ketika kecepatan penting dan galat kecil dapat diterima
  • int/long sen: API pembayaran, penyimpanan uang dalam basis data

Pemeriksaan Singkat

Metode perbandingan BigDecimal mana yang harus Anda gunakan untuk memeriksa apakah dua nilai BigDecimal sama secara numerik, terlepas dari skalanya?

Rangkuman: BigDecimal untuk Perhitungan Keuangan

Hal-hal penting:

  • double/float menyebabkan galat pembulatan — jangan pernah menggunakannya untuk uang
  • Buat BigDecimal dari String atau BigDecimal.valueOf(), bukan dari double
  • Gunakan add(), subtract(), multiply(), divide() untuk aritmetika
  • Selalu tentukan skala dan RoundingMode saat melakukan pembagian
  • Gunakan compareTo() untuk pemeriksaan kesamaan, bukan equals()
  • Pertimbangkan untuk menyimpan uang sebagai sen bilangan bulat dalam pekerjaan basis data/API

Pertanyaan yang Sering Diajukan

Apakah pelajaran “BigDecimal untuk Perhitungan Keuangan” gratis?

Ya — teks lengkap “BigDecimal untuk Perhitungan Keuangan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “BigDecimal untuk Perhitungan Keuangan”?

Gunakan BigDecimal untuk menghindari kesalahan presisi bilangan pecahan dalam perhitungan uang dan pajak. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “BigDecimal untuk Perhitungan Keuangan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Class Math
  2. Aritmetika Bilangan Bulat dan Overflow
  3. BigDecimal untuk Perhitungan Keuangan
  4. NumberFormat dan printf
← Kembali ke Java Academy