0Pricing
Java Academy · Ders

Finansal Hesaplamalar için BigDecimal

Para ve vergi hesaplamalarında kayan nokta duyarlılığı hatalarını önlemek için BigDecimal kullanın.

Finansal Hesaplamalar için BigDecimal, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Mali Hesaplamalar için BigDecimal

Kayan noktalı türler (double, float), ikili gösterim nedeniyle tüm ondalık değerleri tam olarak temsil edemez. Para ve vergiler için BigDecimal kullanınız.

Kayan Nokta Sorunu

İkili kayan nokta, küçük yuvarlama hatalarına yol açar. Mali uygulamalarda bu hatalar birikir ve gerçek hatalara neden olur.

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

BigDecimal'ı Güvenli Şekilde Oluşturma

BigDecimal nesnesini her zaman double yerine bir String'den oluşturunuz. double kurucusunu kullanmak, kayan nokta hassasiyetsizliğini devralır.

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

BigDecimal ile Temel Aritmetik

BigDecimal, aritmetik işlemler için yöntem çağrılarını kullanır: add(), subtract(), multiply(), divide(). Bunlar yeni BigDecimal örnekleri döndürür (değişmez).

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

Yuvarlama Kipleri

RoundingMode, BigDecimal'ın nasıl yuvarlanacağını belirler. Önemli kipler:

  • HALF_UP — standart yuvarlama (0.5 yukarı yuvarlanır)
  • HALF_EVEN — bankacı yuvarlaması (0.5, en yakın çift sayıya yuvarlanır)
  • DOWN — sıfıra doğru kesme
  • CEILING — pozitif sonsuza doğru yuvarlama
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

Bölme ve Ölçek

BigDecimal ile bölme işlemi, sonlanmayan ondalık sayılarda ArithmeticException oluşmasını önlemek için ölçeğin ve yuvarlama kipinin belirtilmesini gerektirir.

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

BigDecimal'ları Karşılaştırma

Değerleri karşılaştırmak için compareTo() kullanınız; değil equals(). equals() ölçeği dikkate alır; 2.0 ve 2.00, equals() açısından NOT eşittir ancak compareTo() açısından ARE eşittir.

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]

Anlamlı Basamaklar için MathContext

MathContext, duyarlığı (anlamlı basamak sayısını) ve yuvarlama kipini belirtir. Ondalık basamaklar yerine tutarlı bir anlamlı basamak duyarlığı gerektiğinde kullanınız.

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...

Alışveriş Sepeti Örneği

Satır öğelerini, vergiyi, indirimi ve nihai toplamı içeren BigDecimal tabanlı eksiksiz bir alışveriş sepeti hesaplaması.

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: Kuruş Cinsinden Para Birimi

Stripe gibi ödeme işlemcileri, ondalık sorunlarını tamamen önlemek için tutarları tamsayı kuruşlar olarak saklar. Kuruşlar ile görüntüleme tutarları arasında dönüşüm yapmak yaygın bir örüntüdür.

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

BigDecimal ile double Ne Zaman Kullanılmalı

İş için doğru türü seçiniz:

  • BigDecimal: kesin ondalık gösterimin önemli olduğu mali tutarlar, vergiler ve faturalar
  • double: hızın önemli olduğu ve küçük hataların kabul edilebilir olduğu bilimsel hesaplamalar, grafikler ve makine öğrenmesi
  • int/long kuruş: ödeme API'leri ve paranın veritabanında saklanması

Hızlı Kontrol

Ölçekten bağımsız olarak iki BigDecimal değerinin sayısal açıdan eşit olup olmadığını denetlemek için hangi BigDecimal karşılaştırma yöntemini kullanmalısınız?

Özet: Mali Hesaplamalar için BigDecimal

Önemli çıkarımlar:

  • double/float yuvarlama hatalarına neden olur; bunları para için asla kullanmayınız
  • BigDecimal'ı double yerine String'den veya BigDecimal.valueOf() ile oluşturunuz
  • Aritmetik işlemler için add(), subtract(), multiply(), divide() kullanınız
  • Bölme işlemi yaparken her zaman ölçeği ve RoundingMode'u belirtiniz
  • Eşitlik denetimleri için equals() yerine compareTo() kullanınız
  • Veritabanı ve API işlemleri için parayı tamsayı kuruşlar olarak saklamayı değerlendiriniz

Sıkça Sorulan Sorular

“Finansal Hesaplamalar için BigDecimal” dersi ücretsiz mi?

Evet — “Finansal Hesaplamalar için BigDecimal” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Finansal Hesaplamalar için BigDecimal” dersinde ne öğreneceğim?

Para ve vergi hesaplamalarında kayan nokta duyarlılığı hatalarını önlemek için BigDecimal kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Finansal Hesaplamalar için BigDecimal” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Math Sınıfının Temelleri
  2. Tamsayı Aritmetiği ve Taşma
  3. Finansal Hesaplamalar için BigDecimal
  4. NumberFormat ve printf
← Java Academy Sayfasına Dön