[Java] 큰 숫자(실수) 다루기 BigDecimal 사용법 & 예제 총정리

BigDecimal을 사용해야 하는 이유

Type 범위
float  1.4E-45 ~ 3.4028235E38
double 4.9E-324 ~ 1.7976931348623157E308

소수점을 저장할 수 있는 타입인 float과 double은 소수점의 정밀도가 완벽하지 않아 값의 오차가 생길 수 있습니다. 특히 소수점 이하의 수를 다룰 때 double과 float은 사칙연산 시 정확한 값을 출력하지 않을 수 있는데요. 그 이유는 내부적으로 수를 저장할 때 이진수의 근사치를 저장하기 때문입니다. 그렇기에 미세한 숫자의 변동도 허용하지 않는 특히 돈과 소수점을 다룬다면 BigDecimal을 사용하셔야 합니다. BigDecimal은 속도는 느리지만 숫자가 어긋날 가능성을 미연에 방지할 수 있습니다.

 

 BigDecimal 사용법 

BigDecimal 선언

BigDecimal bigNumber = new BigDecimal("10000.12345");

BigDecimal은 java.math안에 있으며 위와 같이 선언하시면 됩니다. 특이한 점은 BigDecimal을 초기화하기 위해서는 문자열을 인자 값으로 넘겨주어야 한다는 점입니다. BigDecimal가 문자열로 되어 있기 때문입니다. 사용법은 BigIntger와 같습니다.

 

BigInteger 계산

BigDecimal bigNumber1 = new BigDecimal("100000.12345");
BigDecimal bigNumber2 = new BigDecimal("10000");
				
System.out.println("덧셈(+) :" +bigNumber1.add(bigNumber2));
System.out.println("뺄셈(-) :" +bigNumber1.subtract(bigNumber2));
System.out.println("곱셈(*) :" +bigNumber1.multiply(bigNumber2));
System.out.println("나눗셈(/) :" +bigNumber1.divide(bigNumber2));
System.out.println("나머지(%) :" +bigNumber1.remainder(bigNumber2));

BigDecimal 예제

BigDecimal은 문자열이기에 사칙연산이 안됩니다. 그렇기에 BigDecimal 내부의 숫자를 계산하기 위해서는 BigDecimal클래스 내부에 있는 메서드를 사용해야 합니다.

 

BigDecimal 형 변환

BigDecimal bigDecimal = BigDecimal.valueOf(100000.12345); //double -> BigDecimal

int int_bigNum = bigDecimal.intValue(); //BigDecimal -> int
long long_bigNum = bigDecimal.longValue(); //BigDecimal -> long
float float_bigNum = bigDecimal.floatValue(); //BigDecimal -> float
double double_bigNum = bigDecimal.doubleValue(); //BigDecimal -> double
String String_bigNum = bigDecimal.toString(); //BigDecimal -> String

BigDecimal 클래스를 기본 타입으로 형 변환을 해야 할 경우에는 위와 같이 하시면 됩니다.

 

BigDecimal 두 수 비교

BigDecimal bigNumber1 = new BigDecimal("100000.12345");
BigDecimal bigNumber2 = new BigDecimal("1000000.6789");
		
//두 수 비교 compareTo 맞으면 0   틀리면 -1
int compare = bigNumber1.compareTo(bigNumber2);
System.out.println(compare);

BigDecimal의 값을 비교할 때는 compareTo라는 메서드를 사용합니다.

 

※ 큰 정수 다루기 BigIntger의 사용법은 아래 링크를 참고해주세요.

[Java] 큰 숫자(정수) 다루기 BigInteger 사용법 & 예제 총정리

 

댓글

Designed by JB FACTORY