Hareketli bir ondalık çift yerler üzerinde | Netgez.com
SORU
8 ŞUBAT 2011, Salı


Hareketli bir ondalık çift yerler üzerinde

Ondalık bir yer 12.34 hale geçmek istiyorum 1234, eşit bir çift seti var

Yani bunu yapmam 1234 iki kez .1 çarpın, bu gibi

double x = 1234;
for(int i=1;i<=2;i  )
{
  x = x*.1;
}
System.out.println(x);

Bu baskı sonucu, "12.340000000000002"

Çift deposu 12.34 düzgün bir yolu, sadece iki basamağa biçimlendirme olmadan, var mı?

CEVAP
8 ŞUBAT 2011, Salı


double float, kullanırsanız kullanın ya da bazı yuvarlama hataları yuvarlama görmek için beklemek gerekir. Eğer bunu yapmak, BigDecimal kullanın.

Yani sorunun 0.1 tam bir temsili deÄŸildir, ve iki kez hesaplama yaparak, hata bileÅŸik.

Ancak, 100 doğru bir şekilde temsil edilebilir, böylece deneyin:

double x = 1234;
x /= 100;
System.out.println(x);

yazdıran:

12.34

Bu Double.toString(d) sizin adınıza yuvarlama küçük bir miktar gerçekleştirdiği için çalışır, ama çok değil. Eğer yuvarlama olmadan nasıl göründüğünü merak ediyorsanız:

System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));

baskı:

0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375

Kısacası, yuvarlama bu yaptığınız açıkça ya da değil, kayan nokta mantıklı cevaplar için kaçınılmazdır.


Not: x / 100 x * 0.01 yuvarlama hatası gelince tam olarak aynı değildir. Bu ilk ifade için hata x, ikinci içinde 0.01 oysa değerlerine bağlıdır tur sabit yuvarlak bir hata sahip olmasıdır.

for(int i=0;i<200;i  ) {
    double d1 = (double) i / 100;
    double d2 = i * 0.01;
    if (d1 != d2)
        System.out.println(d1   " != " d2);
}

yazdırır

0.35 != 0.35000000000000003
0.41 != 0.41000000000000003
0.47 != 0.47000000000000003
0.57 != 0.5700000000000001
0.69 != 0.6900000000000001
0.7 != 0.7000000000000001
0.82 != 0.8200000000000001
0.83 != 0.8300000000000001
0.94 != 0.9400000000000001
0.95 != 0.9500000000000001
1.13 != 1.1300000000000001
1.14 != 1.1400000000000001
1.15 != 1.1500000000000001
1.38 != 1.3800000000000001
1.39 != 1.3900000000000001
1.4 != 1.4000000000000001
1.63 != 1.6300000000000001
1.64 != 1.6400000000000001
1.65 != 1.6500000000000001
1.66 != 1.6600000000000001
1.88 != 1.8800000000000001
1.89 != 1.8900000000000001
1.9 != 1.9000000000000001
1.91 != 1.9100000000000001

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • ehowhome

    ehowhome

    22 NÄ°SAN 2009
  • filmurfreakur

    filmurfreaku

    29 Mart 2007
  • Rozetked | Обзоры

    Rozetked | Ð

    5 AÄžUSTOS 2011