본문 바로가기

Java

[박혜웅] JAVA float, double, BigDecimal

우선 부동소수점을 표현하기 위한 요소들을 알 필요가 있다.

부동소수점을 표현하기 위해서는 부호, 지수, 가수가 필요한데..
부호는 +, - 를 표현하고, 지수는 10의 몇 승인지를 표현하고, 가수는 숫자(digit)를 표현한다.
예를 들어, 1200 =1.2 * 1e3 이므로 부호는 +,  지수는 3, 가수는 1.2 가 되겠다.

C나 JAVA에서 float와 double은 각각 4bytes, 8bytes이며, 아래처럼 정보를 나누어 저장한다.
  전체(bits)  부호(bits) 지수(bits)  가수(bits) 
 float  32(4bytes)  1 23 
 double  64(8bytes)  1 11  52 

헛갈리지 말아야 할 것은 위에서 가수는 비트를 나타내었기 때문에, 10 진수로 생각하면,
float 와 double은 각각 8,388,608 (2^23), 4,503,599,627,370,496(2^52) 까지 표시할 수 있는 것이고,
따라서, 유효자리수는 float는 7자리, double은 16자리이다.
이 때, 유효자리수는 소수점 아래의 숫자를 의미한다.

float, double을 사용하다 보면 연산이 부정확한 경우를 종종 볼 수 있는데, 그 이유가 유효자리 수의 한계이다.
다시 말해, 작은 저장 공간 (4byte, 8byte) 으로 큰 수를 표시하려고 하다보니까 생긴 문제이다.
만약 정확한 부동소수점을 표시하고 연산해야 한다면, BigDecimal, BigInteger 클래스를 이용해야 한다.

FloatTypeTest.java
실행 결과
float, double의 유효자리 수가 7, 16자리 인지 확인해 보자.

float      %f: 0.12345679104328156000 
double     %f: 0.12345678901234568000 
BigDecimal %f: 0.12345678901234567890