728x90
반응형
Java - BigDecimal 사용법 및 예제
최근 금융관련 프로젝트를 진행하면서 금액관련 정확한 연산을 위해 BigDecimal을 사용한 적이 있다.
오늘은 정말 간만에 BigDecimal 관련해서 기록할 것이다.
💡 BigDecimal 사용하는 이유
Java에서는 소수점을 저장할 수 있는 float과 double이라는 타입이 존재한다. 하지만 이 2가지 type의 경우는 소수점의 정밀도가 완벽하지 않아 값의 오차가 생길 여지가 존재한다.
이유는 내부적으로 수를 저장할 때 이진수의 근사치를 저장하기 때문이라고 한다.
때문에 이번 금융프로젝트는 돈과 이율 등 과 관련이 높기 때문에 미세한 숫자의 변동도 허용해서는 안되기 때문에 BigDecimal을 사용한다.
💡 BigDecimal 사용법
기본적으로 BigDecimal은 문자열이기 때문에 사칙연산이 되지 않는다.
그래서 BigDecimal연산을 할 때에는 아래와 같이 BigDecimal 메서드를 사용한다.
BigDecimal 선언 및 연산
/* BigDecimal 선언 */
BigDecimal bd1 = new BigDecimal("123.12345");
/* BigDecimal 선언 */
BigDecimal bd1 = new BigDecimal("10000.1234567");
BigDecimal bd2 = new BigDecimal("100000");
/* BigDecimal 연산 */
System.out.println("더하기 add : " + bd1.add(bd2));
System.out.println("빼기 subtract : " + bd1.subtract(bd2));
System.out.println("곱하기 multiply : " + bd1.multiply(bd2));
System.out.println("나누기 divide : " + bd1.divide(bd2));
System.out.println("나머지 remainder : " + bd1.remainder(bd2));
BigDecimal 타입(형) 변환
BigDecimal bd = new BigDecimal("10000.1234567");
bd.toString(); //BigDecimal to String
bd.intValue(); //BigDecimal to int
bd.longValue(); //BigDecimal to long
bd.floatValue(); //BigDecimal to float
bd.doubleValue(); //BigDecimal to double
System.out.println("String BigDecimal : " + bd.toString());
System.out.println("int BigDecimal : " + bd.intValue());
System.out.println("Long BigDecimal : " + bd.longValue());
System.out.println("Float BigDecimal : " + bd.floatValue());
System.out.println("Double BigDecimal : " + bd.doubleValue());
BigDecimal 비교
BigDecimal bd1 = new BigDecimal("9999.12333");
BigDecimal bd2 = new BigDecimal("9999.12222");
/* compareTo
* bd1 = bd2 -> 0 return
* bd1 > bd2 -> 1 return
* bd1 < bd2 -> -1 return
*/
int compateRtn = bd1.compareTo(bd2);
System.out.println(compateRtn);
BigDecimal은 두 수를 compareTo라는 메서드를 사용해 비교할 수 있다.
위 코드박스에 설명은 있지만 쉽게 말해 같으면 0, 전달되는 인자가 작으면 1, 전달되는 인자가 크면 -1이 return된다.

728x90
반응형
'Programming > Java' 카테고리의 다른 글
[Java] List 중복제거 - Set, Stream 활용 (0) | 2022.09.10 |
---|---|
[Java] 스트림(Stream) 개념 및 사용법 / filter, map / iterator 비교 (0) | 2022.06.19 |
[Java] StringBuilder는 무엇인가? - 사용법 및 사용하는 이유 (0) | 2022.01.09 |
[Java] if/else문, switch/case문의 성능 차이에 대해 (1) | 2022.01.02 |
[Java] 왜 좋은 조건문을 작성해야 할까? (0) | 2022.01.02 |