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

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • Besnik Ibrahimi

    Besnik Ibrah

    27 Mart 2010
  • SalGames2016

    SalGames2016

    17 Kasım 2012