Java Puzzle 02 – Monetary Calculation

Merhaba Arkadaslar,
Monetary Calculation / parasal hesaplamalar yaparkan dikkat etmemiz gereken bazi noktalar mevcut. Bu bolumde basit cikarma islemleri yapacagiz , bakalim sonuclar nasil olacak.

DecimalSubstraction.java

package _02.decimal.substraction;

public class DecimalSubstraction {

	public static void main(String[] args) {
		System.out.println(2.00 - 1.1);				
	}
}

Cikti olarak 0,90 bekliyoruz ? Yani basitce noktadan sonra 2 sayi olsun. Fakat ciktimiz  0.8999999999999999 olacaktir.

DecimalSubstraction.java

package _02.decimal.substraction;

public class DecimalSubstraction {

	public static void main(String[] args) {
		System.out.println(2.00 - 1.1);
		System.out.println(2.00 - 1.2);
		System.out.println(2.00 - 1.3);
		System.out.println(2.00 - 1.4);
		System.out.println(2.00 - 1.5);
		System.out.println(2.00 - 1.6);
		System.out.println(2.00 - 1.7);
		System.out.println(2.00 - 1.8);
		System.out.println(2.00 - 1.9);
		System.out.println(2.00 - 2);
				
	}
}

Ciktimiz :

1.0
0.8999999999999999
0.8
0.7
0.6000000000000001
0.5
0.3999999999999999
0.30000000000000004
0.19999999999999996
0.10000000000000009
0.0

Java’da , float ve double primitive veri tipleri “floating number” tanimlamak icin kullanilmaktadir.
double ve float , 2’lik sistemde fraction/çok küçük miktar olarak saklanmaktadir.
1/4 + 1/8 + 1/16 + …

Bazi double degerler icin kesin olarak bu sekilde/(binary floating point) bir ifade mumkun olmamaktadir.

Bir cozum olarak printf metodu ile formatlama yapabiliriz fakat bu yontem genel olarak onerilmemektedir.

DecimalSubstractionPrintf.java

package _02.decimal.substraction;

public class DecimalSubstractionPrintf {

	public static void main(String[] args) {

		System.out.printf("%.2f\n", 2.00 - 1.1);
		System.out.printf("%.2f\n", 2.00 - 1.2);
		System.out.printf("%.2f\n", 2.00 - 1.3);
		System.out.printf("%.2f\n", 2.00 - 1.4);
		System.out.printf("%.2f\n", 2.00 - 1.5);
		System.out.printf("%.2f\n", 2.00 - 1.6);
		System.out.printf("%.2f\n", 2.00 - 1.7);
		System.out.printf("%.2f\n", 2.00 - 1.8);
		System.out.printf("%.2f\n", 2.00 - 1.9);
	}
}
	
0.90
0.80
0.70
0.60
0.50
0.40
0.30
0.20
0.10

Bir baska cozum olarak java.math.BigDecimal sinifini kullanabiliriz. Burada dikkat etmemiz gereken nokta herzaman BigDecimal(String) yapilandiricini kullanmamiz gerekli. BigDecimal(double) kullanirsak arguman olarak verdigimiz degerin tam degerini (exact value) kullanarak bir BigDecimal objesi olusturacaktir.
Ornegin ; 1.1 degeri 1.100000000000000088817841970012523233890533447265625 olarak ifade edilmektedir.

BigDecimalTest.java

package _02.decimal.substraction;

import java.math.BigDecimal;

public class BigDecimalTest {
	public static void main(String[] args) {

		System.out.println(new BigDecimal(1.1));
		System.out.println(new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
		System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));

	}
}

1.100000000000000088817841970012523233890533447265625
0.899999999999999911182158029987476766109466552734375
0.90

Monetary Calculation icin int , long ya da BigDecimal tiplerini kullanmamiz gerekmektedir.

Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *