BigDecimal
먼저 BigDecimal
에 대해서 간단히 알아보도록 하자.BigDecimal
은 큰 수를 표현하거나 부동소수점을 해결할 수 있는 클래스이다.
거두절미하고 코드를 보자.
@Test public void primitive() { System.out.println(2.0 - 1.1); }
위 코드에서는 무엇이 출력이 될까?
0.9가 나오길 기대하겠지만, 위코드는 0.8999999999999999 라는 이상한 값을 반환한다.
자바 기본서를 보던 옛날로 돌아가보자. 우리는 첫장에서 primitive type들에 대해서 공부를 했을 것이다. 그리고 각각의 type은 고유의 bit 크기를 가지고 있다. double
같은 경우에는 32bit이고 이는 4.94065645841246544E-324 ~ 1.79769313486231570E+308를 표현할 수 있다고 한다.
어마어마한 크기긴 하지만 저걸로는 만족되지 않기도 하다.
이유는 0과 1사이에는 얼만큼의 숫자가 있을까? 아는 것처럼 무한한 숫자가 존재한다.
32bit로는 이 수를 다 표현을 못하기 때문에 컴퓨터는 표현이 안되는 숫자는 근사값을 제공해준다. 방금 보았던 코드처럼 말이다.
이 문제는 BigDecimal
을 이용하면 간단하게 해결할 수 있다.
@Test public void bigDecimal() { System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1"))); }
해당 수를 BigDecimal
로 변경하여 메소드를 통해 연산을 하는 것이다.
이번에는 기대하는 것처럼 0.9라는 값을 얻을 수 있다.
서비스 개발 중 실수 단위의 돈을 다루는 로직이 있다면 필히 BigDecimal
을 고려하자.
추가적으로 BigDecimal
의 생성자로 일반적인 수를 넣을 수도 있지만, 지수를 이용해서 수를 넣을 수도 있다. 예를 들면 new BigDecimal("2.564E6")
처럼 말이다. E와 뒤의 숫자는 10의 지수를 표현한다. 그래서 위의 수는 2564000과 같다.
BigDecimal
을 String
으로 표현하는 몇가지 방법을 알아보자.
toString()
@Test public void tostring() { System.out.println(new BigDecimal("2564000").toString()); System.out.println(new BigDecimal("2.564E6").toString()); }
2564000
2.564E+6
toPlainString()
@Test public void toPlainString() { System.out.println(new BigDecimal("2564000").toPlainString()); System.out.println(new BigDecimal("2.564E6").toPlainString()); }
2564000
2564000
toEngineeringString()
@Test public void toEngineeringString() { System.out.println(new BigDecimal("2564000").toEngineeringString()); System.out.println(new BigDecimal("2.564E6").toEngineeringString()); }
2564000
2.564E+6
'Java' 카테고리의 다른 글
Web applications and Project Loom (번역) (0) | 2023.03.12 |
---|---|
lombok.config 옵션 (0) | 2023.03.05 |
Java의 ScheduledExecutorService를 이용해서 스케줄러를 만들어보자 (1) | 2018.05.23 |
[Jackson] JsonInclude 속성에 대해 알아보자. (2) | 2018.05.23 |
Java로 날씨 알림 서비스를 만들어보자 (OOP, Clean Code) (1) | 2018.05.21 |