Skip to content

부동 소수점 자료를 정확하게 저장하는 방법 - BigDecimal 객체 이용

🔢 java 내에서 부동소수점 자료형

부동소수점 자료는 정수를 넘어 소수점을 표현하기 위해 사용되는 자료형이다. 하지만, 이 자료형으로 정확한 계산을 하기에는 어딘가 부족해보인다. 아래의 예를 살펴보자.

floatingpoint.java
jshell> double d1= 5.5555
d1 ==> 5.5555

jshell> d1 % 5
$7 ==> 0.5555000000000003

jshell> d1 % 4
$8 ==> 1.5555000000000003

jshell> d1 % 1
$9 ==> 0.5555000000000003

부동 소수점 자료형을 모듈러 연산을 한 결과이다. 깔끔하게 떨어지지 않고, 맨 끝에 3이라는 작은 값이 추가되는 것을 확인할 수 있다. 이렇게 되면 정확도가 우선인 프로그램을 짤 때 예측하지 못하는 오류가 생길 수 있을 것이라 생각된다.

또다른 예를 살펴보자.

floatingpoint2.java
1
2
3
4
5
6
7
8
jshell> double d1 = 3.3333331111111111
d1 ==> 3.333333111111111

jshell> double d2 = 3.0000001111111111
d2 ==> 3.000000111111111

jshell> d1 + d2
$23 ==> 6.3333332222222225

두 연산의 결과가 6.3333332222222222 가 아닌 맨 끝에 5가 추가되는 것을 볼 수 있다. 이로서 부동소수점 연산이 얼마나 정확하게 계산하고 있지 않은지 확인할 수 있었다.

📌 소수점 연산은 BigDecimal class를 이용하자.

정확한 소수점 연산을 하기 위해서는 BigDecimal class를 이용하여 아래와 같이 계산을 해보자. BigDecimal에 숫자를 넣을 때, 문자열을 넣는 것을 주목하자.

BigDecimalExample.java
1
2
3
4
5
6
7
8
jshell> BigDecimal b1 = new BigDecimal("3.3333331111111111");
b1 ==> 3.3333331111111111

jshell> BigDecimal b2 = new BigDecimal("3.0000001111111111");
b2 ==> 3.0000001111111111

jshell> b1.add(b2)
$26 ==> 6.3333332222222222 // 값이 정확하게 계산이 되었음


Comments