본문 바로가기

개발세상/java

소수점 계산이 필요할 땐, double이 아닌 BigDecimal in java

728x90
반응형

개발을 하다가 회사에서 코드 리뷰를 받았다. 소수점 계산할 일이 있었는데, double 같은 경우 부동소수점 오류가 있으니 double이 아닌 BigDecimal을 사용해야 한다고! 보통 돈 계산을 해도 소수점까지 할 일은 없어서 아직까지 몰랐던 건지 개인적으로 공부를 안 해서 그랬던 거였는지 약간 현타가 왔는데 아무것도 안 하면 또 0이기에 정리를 해본다.

 

소수점 계산이 필요할 땐, double이 아닌 BigDecimal

 

썸네일
썸네일

 

리뷰를 받고나서 BigDecimal 형에 대해서 한 번이라도 들어본 기억은 있는 것 같은데 정확히 알지 못하는 상황이었다.

 

그래서 사용법 자체도 모르겠어서 당장 구글링을 진행했었음

일반 사칙연산 같은 경우 +, -, *, / 로 가능한데 BigDecimal 같은 경우는 아예 지원하는 메서드가 있어서 그것을 사용해야 했음.

 

관련해서 알아볼 겸 정리할 겸 포스팅으로 작성한다.

 

 

반응형

 

 

double double1 = 0.1;
double double2 = 0.2;

System.out.println("double :: " + double1 * double2 );		

BigDecimal big1 = new BigDecimal("0.1");
BigDecimal big2 = new BigDecimal("0.2");

System.out.println("BigDecimal :: " + big1.multiply(big2));

 

그냥 자바 소스를 일단 이렇게 작성해보았다.

 

double 형식으로 곱하기, BigDecimal 형식으로 곱하기 진행.

그러면 두 가지 모두 내가 생각하는 답은 0.02

 

하지만 나오는 결과는 아래와 같았다.

 

double-BigDecimal결과
double-BigDecimal결과

 

0.02라는 올바른 답이 나온 것은 BigDecimal 이었음! 

 

double형은 0.02가 아닌 뒤에 더 부가적으로 0.0000000000004 이런 식으로 붙어있었다.

이래서 사람들이 BigDecimal을 사용해야 한다는 것이었고, 연산도 +,-,*,/로 간단히 끝나지는 않았음.

 

그래서 관련 내용도 간단히 정리해본다.

 

728x90

 

 

사칙연산(+,-,*,/)

 

연산을 할 때, 제일 기본적인 더하기, 빼기, 곱하기, 나누기는 add, subtract, multiply, divide로 진행한다.

써본 적이 제대로 없다 보니 어색할 따름

 

BigDecimal big1 = new BigDecimal("25.12");
BigDecimal big2 = new BigDecimal("2.1");

System.out.println("더하기 :: " + big1.add(big2));
System.out.println("빼기 :: " + big1.subtract(big2));
System.out.println("곱하기 :: " + big1.multiply(big2));
System.out.println("나누기 :: " + big1.divide(big2, 2, BigDecimal.ROUND_UP));

 

사칙연산 예시로 코딩해보면 이렇게 되겠다.

 

나누기 같은 경우는 자릿수를 정해줘야 오류가 안 나고, 나누기 같은 경우 올림, 내림, 반올림, 반내림이 있기 때문에 그것도 설정해줘서 둘째 자리까지만 보겠다고 체크해두었다!

 

 

사칙연산결과
사칙연산결과

 

그렇게 나온 결과는 위와 같았고, 크게 오류는 안 났는데 나누기할 때만 주의하시면 되겠다!

 

그리고 BigDecimal 형식을 비교하기 위해서는 >, <, = 가 아닌 compareTo를 사용해야 한다.

 

CompareTo로 비교했을 때, 결과가 -1일 경우에는 작다는 뜻을 의미한다.

0일 때는 같다는 뜻, 1일 때는 크다는 뜻으로 알고 개발을 진행하면 된다!

 

소수점 표시를 할 수 있는 함수는 setScale인데 divide 함수를 사용했을 때처럼 원하는 소수점 자리와 올림, 버림, 반올림, 반내림을 명시해주면 끝난다!

 

이번 기회를 통해서 BigDecimal에 대해 새롭게 알게 되었고, 공부를 더 열심히 해야겠다는 생각이 들었다.

 

이제는 외면하지 말고 해야겠음.. 열심히 포스팅해보겠습니다!

728x90
반응형