Perhitungan pembagian integer dengan float yang aneh

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Perhitungan pembagian integer dengan float yang aneh

Ifnu bima
HI All,

Saya lagi bikin perhitungan untuk menghitung persentase diskon antara
harga normal dan harga setelah diskon. Tapi ada bug yang cukup aneh,
contoh kodenya seperti di bawah ini :


 BigDecimal listPrice = new BigDecimal(510000);
        BigDecimal offerPrice = new BigDecimal(433500);
        int itemDiscount = (int)Math.ceil(((listPrice.longValue() -
offerPrice.longValue()) / (float) listPrice.longValue()) * 100);
        System.out.println(itemDiscount);


kalau dihitung menggunakan kalkulator, nilai itemDiscount pas 15,
tetapi yang muncul justri 16. Trus karena penasaran akhirnya saya
tambahkan System.out.println untuk lihat hasil perhitungan langkah per
langkah, seperti di bawah ini :

        System.out.println(listPrice.longValue() -
offerPrice.longValue()); //76500
        System.out.println((listPrice.longValue() -
offerPrice.longValue()) / (float) listPrice.longValue()); //0.15
        System.out.println(((listPrice.longValue() -
offerPrice.longValue()) / (float) listPrice.longValue()) * 100);
//15.000001

baris 1 dan 2 nilainya bener, baris ketiga ketahuan deh salahnya,
hasilnya kok 15.000001 !!!, padahal kan 0.15 * 100 gitu loh!!! hah???

Anehnya kalau saya pindahkan * 100-nya ke depan seperti ini :

((listPrice.longValue() - offerPrice.longValue()) * 100 / (float)
listPrice.longValue());

hasilnya bener 15.0, hah? salahnya dimana ya? berasa aneh2 nih
hitungan di java kalau ada pembagian :D

--
http://ifnubima.org/indo-java-podcast/
http://project-template.googlecode.com/
@ifnubima

regards
Reply | Threaded
Open this post in threaded view
|

Bls: [netbeans-indonesia] Perhitungan pembagian integer dengan float yang aneh

nerd dracula
jiaah master java kebingungan :p

maaf niiih mau kasih saran aja - dari mantan murid :)
saya pernah ngalamin yg beginian waktu di project asuransi jiwa -- ngitung nilai tunai
kondisinya mirip - tapi di .net - anyway karena logikanya perhitungan - yg penting konsep itung-itungannya kudu bener

(int)Math.ceil(((listPrice.longValue() - offerPrice.longValue()) / (float) listPrice.longValue()) * 100);

apakah dah coba di split itung-itungannya
misalnya gini
step 1;
(listPrice.longValue() - offerPrice.longValue())
step 2:
hasil step 1 /  (float) listPrice.longValue()
step 3:
hasil step 2 * 100

waktu diproject asuransi saya bikin gitu waktu ngitung nilai tunai dari polis asuransi -- hasilnya benar :)
kalo masih error juga berarti gak apa-apa donk kalo salah :p
namanya aja murid kan belajarnya dari guru (yg lagi keder) wakakaka

System.out.println(itemDiscount);




________________________________
 Dari: Ifnu bima <[hidden email]>
Kepada: "[hidden email]" <[hidden email]>; [hidden email]
Dikirim: Senin, 19 Agustus 2013 9:45
Judul: [netbeans-indonesia] Perhitungan pembagian integer dengan float yang aneh
 


 
HI All,

Saya lagi bikin perhitungan untuk menghitung persentase diskon antara
harga normal dan harga setelah diskon. Tapi ada bug yang cukup aneh,
contoh kodenya seperti di bawah ini :

BigDecimal listPrice = new BigDecimal(510000);
BigDecimal offerPrice = new BigDecimal(433500);
int itemDiscount = (int)Math.ceil(((listPrice.longValue() -
offerPrice.longValue()) / (float) listPrice.longValue()) * 100);
System.out.println(itemDiscount);

kalau dihitung menggunakan kalkulator, nilai itemDiscount pas 15,
tetapi yang muncul justri 16. Trus karena penasaran akhirnya saya
tambahkan System.out.println untuk lihat hasil perhitungan langkah per
langkah, seperti di bawah ini :

System.out.println(listPrice.longValue() -
offerPrice.longValue()); //76500
System.out.println((listPrice.longValue() -
offerPrice.longValue()) / (float) listPrice.longValue()); //0.15
System.out.println(((listPrice.longValue() -
offerPrice.longValue()) / (float) listPrice.longValue()) * 100);
//15.000001

baris 1 dan 2 nilainya bener, baris ketiga ketahuan deh salahnya,
hasilnya kok 15.000001 !!!, padahal kan 0.15 * 100 gitu loh!!! hah???

Anehnya kalau saya pindahkan * 100-nya ke depan seperti ini :

((listPrice.longValue() - offerPrice.longValue()) * 100 / (float)
listPrice.longValue());

hasilnya bener 15.0, hah? salahnya dimana ya? berasa aneh2 nih
hitungan di java kalau ada pembagian :D

--
http://ifnubima.org/indo-java-podcast/
http://project-template.googlecode.com/
@ifnubima

regards