Java
[박혜웅] JAVA float, double, BigDecimal
BAGE
2010. 12. 14. 18:57
우선 부동소수점을 표현하기 위한 요소들을 알 필요가 있다.
부동소수점을 표현하기 위해서는 부호, 지수, 가수가 필요한데..
부호는 +, - 를 표현하고, 지수는 10의 몇 승인지를 표현하고, 가수는 숫자(digit)를 표현한다.
예를 들어, 1200 =1.2 * 1e3 이므로 부호는 +, 지수는 3, 가수는 1.2 가 되겠다.
C나 JAVA에서 float와 double은 각각 4bytes, 8bytes이며, 아래처럼 정보를 나누어 저장한다.
전체(bits) | 부호(bits) | 지수(bits) | 가수(bits) | |
float | 32(4bytes) | 1 | 8 | 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