Java

BigDecimal의 toString(), toPlainString(), toEngineeringString()

AlwaysPr 2018. 9. 11. 22:40

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