개발을 하다가 회사에서 코드 리뷰를 받았다. 소수점 계산할 일이 있었는데, 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
하지만 나오는 결과는 아래와 같았다.
0.02라는 올바른 답이 나온 것은 BigDecimal 이었음!
double형은 0.02가 아닌 뒤에 더 부가적으로 0.0000000000004 이런 식으로 붙어있었다.
이래서 사람들이 BigDecimal을 사용해야 한다는 것이었고, 연산도 +,-,*,/로 간단히 끝나지는 않았음.
그래서 관련 내용도 간단히 정리해본다.
사칙연산(+,-,*,/)
연산을 할 때, 제일 기본적인 더하기, 빼기, 곱하기, 나누기는 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에 대해 새롭게 알게 되었고, 공부를 더 열심히 해야겠다는 생각이 들었다.
이제는 외면하지 말고 해야겠음.. 열심히 포스팅해보겠습니다!
'개발세상 > java' 카테고리의 다른 글
java build error : unable to find valid certification path to requested target (0) | 2023.10.15 |
---|---|
Spring demo, 스프링 데모 파일 만드는법 (0) | 2023.09.29 |
JAVA 자바 datasource application.yml camelcase (0) | 2022.07.26 |
자바 JAVA 특정 필드, ToString시 제외Exclude 하고 싶을 때 annotation (0) | 2022.07.24 |
String 배열 array, jstl foreach 돌리는 법 (0) | 2022.05.10 |