반응형
안녕하세요.
오늘은 정확도가 좋은 BigDecimal 자료형에 대해서 알아보겠습니다.
1. BigDecimal ?
BigDecimal 자료형은 다른 자료형들. int, double, float들에 비해 사용하기 불편합니다.
그렇다면 이 자료형을 사용해야 할 때는 언제일까요?
우리가 자주 사용하는 실수형 자료형. double, float은 소수점의 정밀도가 정확하지 않아 연산 시, 값의 오차가 발생할 수 있습니다. 이 이유로는 double, float은 실수를 이진수의 근사치로 저장하기 때문입니다.
위에 설명해드린 것 처럼 소수점 아래, 아주 작은 숫자의 오차를 허용하지 않는 자료형을 사용할 때 BigDecimal 자료형을 사용합니다.
이 BigDecimal 자료형은 속도가 느리고 사용하기 불편하지만, 숫자의 오차를 허용하지 않는 정확한 자료형입니다. 돈과 소수점을 다루는 경우에 적합합니다.
2. BigDecimal 선언 방법
// 숫자로 초기화 시켜줄 때, 인자 값에 문자열 타입으로 넘겨줘야 합니다.
BigDecimal num1 = new BigDecimal("1234.56789");
BigDecimal num2 = new BigDecimal("456.789");
위의 주석에 설명한 것처럼, BigDecimal 초기화 시, 문자열 타입의 인수를 넘겨줘야 합니다.
3. BigDecimal 사칙연산
BigDecimal num1 = new BigDecimal("1234.56789");
BigDecimal num2 = new BigDecimal("456.789");
System.out.println("덧셈 :" + num1.add(num2));
System.out.println("뺄셈 :" + num1.subtract(num2));
System.out.println("곱셈 :" + num1.multiply(num2));
// 나눗셈의 경우 무한대로 나눠질 수 있기에 자리 수를 정해준다.
// 아래의 경우는 소수점 아래 3자리까지만 출력했다.
// RoundingMode.HALF_EVEN은 Java의 기본 반올림 정책으로 금융권에서 사용하는 Bankers Rounding와 동일한 알고리즘
System.out.println("나눗셈 :" + num1.divide(num2, 3, RoundingMode.HALF_EVEN));
System.out.println("나머지 :" + num1.remainder(num2));
위의 예제처럼 사칙연산 시, 메소드를 이용해서 구해야합니다.
또한, 나눗셈 나머지와 같이 소수점이 나올 수 있는 건 소수점 처리를 해주는 것이 바람직합니다.
4. BigDecimal 비교 방법
BigDecimal num1 = new BigDecimal("1234.56789");
BigDecimal num2 = new BigDecimal("456.789");
// 같으면 0 반환, 적으면 -1, 많으면 1 반환
int result = num1.compareTo(num2);
System.out.println("결과 : " + result);
BigDecimal 자료형을 비교할 땐, compareTo 메소드를 이용합니다.
위 예제를 기준으로 num1과 num2가 같을 때 0 반환, num1보다 num2가 클 때 -1 반환, num1이 num2보다 클 때 1 반환입니다.
5. BigDecimal -> 다른 자료형으로 변환 방법
BigDecimal num1 = new BigDecimal("1234.56789");
String String_num1 = num1.toString(); // String형으로 변환
int int_num1 = num1.intValue(); // int형으로 변환
float float_num1 = num1.floatValue(); // float형으로 변환
double double_num1 = num1.doubleValue(); // double형으로 변환
long long_num1 = num1.longValue(); // long형으로 변환
반응형
'BE > Java' 카테고리의 다른 글
[cron 표현식] / 사용 시 유의 점 (0) | 2021.07.08 |
---|---|
[JAVA] Date, SimpleDateFormat, Calendar 사용법 (0) | 2021.03.23 |
[JAVA] EOF(End of File) 처리 방법 (0) | 2021.02.23 |
[Java] BufferedReader, BufferedWriter (0) | 2021.02.21 |
[Java] String to Int / Int to String 변환 방법 (0) | 2021.02.17 |