0Pricing
Java Academy · Ders

Para İçin Neden double Kullanılmamalı

Kayan nokta duyarlılığı sorunları

Para İçin Neden double Kullanılmamalı, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. 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.

Tehlikeli Bir Varsayılan

Fiyatları bir double içinde saklamak doğal görünür. Ne yazık ki double, ondalık kesirlerin çoğunu tam olarak temsil edemez; bu da finansal hesaplamaları bozan küçük hatalara yol açar.

Klasik Sürpriz

double ile 0.1 ve 0.2'yi topladığınızda 0.3 elde etmezsiniz. Küçük bir yuvarlama hatası içeren bir değer elde edersiniz.

public class Main {
    public static void main(String[] args) {
        double result = 0.1 + 0.2;
        System.out.println(result);
    }
}

Neden Böyle Olur

Bilgisayarlar double değerlerini ikili sistemde saklar. Üçte birin ondalık sistemde tam olarak yazılamaması gibi, 0.1 gibi birçok ondalık değer de ikili sistemde tam olarak yazılamaz.

En yakın ikili yaklaşım saklanır ve hata birikir.

Hatalar Birikir

Tek bir küçük hata önemsiz görünebilir, ancak binlerce işlem üzerinde çalışan bir döngüde farklar birikerek gözle görülür yanlışlıklara dönüşür.

public class Main {
    public static void main(String[] args) {
        double total = 0.0;
        for (int i = 0; i < 10; i++) {
            total += 0.1;
        }
        System.out.println(total);
    }
}

Başarısız Eşitlik Karşılaştırması

Yuvarlama hataları nedeniyle, hesaplanan double değerlerini == ile karşılaştırmak, eşit olmalarını beklediğiniz durumlarda çoğu zaman başarısız olur.

public class Main {
    public static void main(String[] args) {
        double a = 0.1 + 0.2;
        double b = 0.3;
        System.out.println(a == b);
    }
}

Para İçin Kesinlik Gerekir

Finans alanında sentin bir kısmı kadar hata kabul edilemez. Denetçiler toplamların kuruşuna kadar uyuşmasını bekler.

Bu nedenle para, kayan noktalı bir türde asla saklanmamalıdır.

Çözüm: BigDecimal

Java, ondalık sayıları tam olarak saklayan bir BigDecimal sınıfı sağlar. Ölçeklenmemiş değeri ve scale değerini ayrı ayrı izlediği için 0.1 gerçekten 0.1 anlamına gelir.

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("0.1");
        BigDecimal b = new BigDecimal("0.2");
        System.out.println(a.add(b));
    }
}

Her Zaman Dize Yapıcısını Kullanın

Bir BigDecimal oluştururken String kullanın, double kullanmayın. Bir double değeri geçirmek, ikili sistemdeki hatayı BigDecimal içine taşır.

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal fromDouble = new BigDecimal(0.1);
        BigDecimal fromString = new BigDecimal("0.1");
        System.out.println(fromDouble);
        System.out.println(fromString);
    }
}

Ya da valueOf Kullanın

BigDecimal.valueOf güvenli bir kısa yoldur. double değerini standart dize biçimini kullanarak dönüştürür ve ham ikili sistem hatasını önler.

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal price = BigDecimal.valueOf(19.99);
        System.out.println(price);
    }
}

Parayı Sent Olarak Saklama

Basit durumlarda bir başka seçenek, parayı long kullanarak tam sayı cinsinden sent olarak saklamaktır. Böylece 19.99 dolar, 1999 sent olur ve tüm matematik işlemleri tam sayı aritmetiğiyle kesin olarak yapılır.

public class Main {
    public static void main(String[] args) {
        long cents = 1999;
        long total = cents * 3;
        System.out.println(total + " cents");
    }
}

Sonuç

Küçük hataların sorun olmadığı bilimsel ve grafik uygulamalarında float ve double kullanın. Para ve tam olması gereken her değer için BigDecimal veya sentleri tam sayı olarak kullanın.

Hızlı Kontrol

Kayan noktalı sayı hassasiyeti hakkındaki anlayışınızı sınayın.

Özet

double türünün para işlemlerinde neden başarısız olduğunu öğrendiniz:

  • İkili kayan nokta, birçok ondalık değeri tam olarak saklayamaz
  • 0.1 + 0.2 işleminin 0.3'e eşit olmaması gibi hatalar birikir
  • Kesin ondalık aritmetiği için BigDecimal kullanın
  • Onu bir String'den veya valueOf ile oluşturun; ham bir double değerinden asla oluşturmayın
  • Sentleri tam sayı olarak saklamak başka bir kesin seçenektir

Sıkça Sorulan Sorular

“Para İçin Neden double Kullanılmamalı” dersi ücretsiz mi?

Evet — “Para İçin Neden double Kullanılmamalı” 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.

“Para İçin Neden double Kullanılmamalı” dersinde ne öğreneceğim?

Kayan nokta duyarlılığı sorunları 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 1. dersidir.

“Para İçin Neden double Kullanılmamalı” 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. Para İçin Neden double Kullanılmamalı
  2. BigDecimal ile Çalışma
  3. Yuvarlama ve Ölçek
  4. Büyük Sayılar İçin BigInteger
← Java Academy Sayfasına Dön