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
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
Ondalık arasındaki fark, ve içinde Yüz...
Çift vs iPhone üzerinde yüzer...
Nasıl bir çift için bir ondalık nokta ...
&Quot anlamı nedir;... ..." token...
C iki ondalık yuvarlak çift#?...