[자바] BigDecimal 초기값 설정 / 비교(compareTo) / 사칙연산 / 형변환 총정리
BigDecimal은 java.math.BigDecimal 라이브러리를 import하여 사용하게되는데 다음 예제 처럼 다른 데이터 타입과 다르게 null인값을 문자열로 형변환하면 오류가 발생한다.
BigDecimal bdc = null;
String.valueOf(bdc);
반드시 null 체크 후 형변환이 필요하다.
long log = (bdc == null ? 0 : bdc.longValue());
이제 하나씩 살펴보자.
BigDecimal 초기값 생성
BigDecimal Val = new BigDecimal(“125000000000000000”);
BigDecimal Val = BigDecimal.ZERO;
BigDecimal fromBigInteger = new BigDecimal(new BigInteger(“1000”));
BigDecimal fromCharArray = new BigDecimal(new char[]{‘1’, ‘5’, ‘4’, ‘3’});
BigDecimal fromInt = new BigDecimal(1000);
BigDecimal fromLong = new BigDecimal(10000000L);
BigDecimal fromDouble = new BigDecimal(1.12); // 이렇게 사용하면 안 됨!
BigDecimal 기본 상수
BigDecimal 타입은 자주 쓰는 0, 1, 10은 미리 상수로 정의되어 있다.
public class test {
public static void main(String[] args) {
System.out.println(BigDecimal.ZERO);
System.out.println(BigDecimal.ONE);
System.out.println(BigDecimal.TEN);
}
}
BigDecimal값 비교하기
BigDecimal 은 compareTo 함수를 사용해 비교한다. 부등호로 사용하는 비교 연산자로는 비교할 수 없다.
BigDecimal number1 = new BigDecimal(“123456”);
BigDecimal number2 = new BigDecimal(“12345.33”);
int ststus = number1.compareTo(number2);
number1 이 number2 보다 크면 1 값이 리턴된다.
number1 이 number2 보다 작으면 -1
number1 이 number2 보다 같으면 0 을 리턴한다.
BigDecimal 사칙연산
BigDecimal 은 흔히 사용하는 기호(+, -, /, *)로 사칙연산을 할 수 없다. 사칙연산을 할 때는 add, subtract, multiply, divide 함수를 활용해 계산한다.
BigDecimal number1 = new BigDecimal(“12250.125”);
BigDecimal number2 = new BigDecimal(“12150.352”);
System.out.println(“더하기 : ” + number1.add(number2));
System.out.println(“빼기 : ” + number1.subtract(number2));
System.out.println(“곱하기 : ” + number1.multiply(number2))
나누기는? 나누기는 위에와 같이 계산하면 아래와 같은 에러 메시지가 발생한다.
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
나누기시 divide시 자릿수와 결과셋을 지정해줘야 한다.
나누기를 계산할 때는 소수점 처리를 해주어야 한다.
나누기 소수점 처리 방법
BigDecimal.ROUND_UP : 올림
BigDecimal.ROUND_DOWN : 버림
BigDecimal.ROUND_HALF_UP : 반올림 ( 5 이상 올림 )
BigDecimal.ROUND_HALF_DOWN : 반내림 ( 5 이하 내림 )
다음 예제는 BigDecimal 나누기 예제이다
BigDecimal number1 = new BigDecimal(“12250.125”);
BigDecimal number2 = new BigDecimal(“12150.352”);
System.out.println(“나누기 : ” + number1.divide(number2, BigDecimal.ROUND_UP));
System.out.println(“나누기 : ” + number1.divide(number2, BigDecimal.ROUND_DOWN));
System.out.println(“나누기 : ” + number1.divide(number2, BigDecimal.ROUND_HALF_UP));
System.out.println(“나누기 : ” + number1.divide(number2, BigDecimal.ROUND_HALF_DOWN));
System.out.println(“나누기 : ” + number1.divide(number2, 4, BigDecimal.ROUND_UP)); //소수점 4자리까지 표시
System.out.println(“나누기 : ” + number1.divide(number2, 4, BigDecimal.ROUND_DOWN)); //소수점 4자리까지 표시
System.out.println(“나누기 : ” + number1.divide(number2, 4, BigDecimal.ROUND_HALF_UP)); //소수점 4자리까지 표시
System.out.println(“나누기 : ” + number1.divide(number2, 4, BigDecimal.ROUND_HALF_DOWN)); //소수점 4자리까지 표시
System.out.println(“나누기 : ” +number1.divide(number2, 2, BigDecimal.ROUND_CEILING));
다음 예제도 참고하자.
BigDecimal a = new BigDecimal(“7”);
BigDecimal b = new BigDecimal(“3”);
// 나누기 – 소수점 아래 첫째 자리까지 반올림
// 2.3
a.divide(b, 1, RoundingMode.HALF_UP);
// 나누기 – 총 자릿수를 34개로 제한하고 반올림(HALF_EVEN)
// 2.333333333333333333333333333333333
a.divide(b, MathContext.DECIMAL128);
// 나누기 – 총 자릿수를 제한하지 않고 반올림
// 2.33333…
// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact
a.divide(b, MathContext.UNLIMITED);
// 나머지(%)
// 1
a.remainder(b);
나머지(%) – 총 자릿수를 34개로 제한
// 1
a.remainder(b, MathContext.DECIMAL128);
// 절대값
// 3
new BigDecimal(“-3”).abs();
// 최대값
// 7
a.max(b);
// 최소값
// 3
a.min(b);
// 부호 변환
// -7
a.negate();
BigDecimal 형변환
BigDecimal num1 = new BigDecimal(“123000.7890”);
String String_num1 = num1.toString();
int int_num1 = num1.intValue(); // int형
float float_num1 = num1.floatValue(); // float형
double double_num1 = num1.doubleValue(); // double
long long_num1 = num1.longValue(); // long형
String을 BigDecimal로 형변환
String num = “123456798”;
BigDecimal number = new BigDecimal(num);
만약 BigDecimal로 변환하려는 String 값이 숫자가 아닌 값이 포함된 경우 예외처리가 필요하다.
String num = “123aa”;
BigDecimal tmp;
try {
tmp = new BigDecimal(num);
} catch ( NumberFormatException e ) {
tmp = new BigDecimal(“0”);
}
BigDecimal.valueOf(double) 메서드를 사용하여 String을 BigDecimal 로 변환할 수도 있다.