AndroidJava프로그래밍

[자바] 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 로 변환할 수도 있다.


error: Content is protected !!