개발

5. float, double, Bigdecimal 자료형 (실수 자료형) 본문

Backend/Java

5. float, double, Bigdecimal 자료형 (실수 자료형)

Study 2021. 7. 11. 17:15

안녕하세요 

실수 자료형에 관해 설명 하겠습니다.

 

자바가 지원하는 기본자료형 중 실수형은 Float 과 Double이 있습니다.

각각 4byte(32bit) 와 8byte(64bit)의 메모리 공간을 사용합니다.

또한 메모리가 허락하는 한 무제한으로 사용할 수 있는 BigDecimal이 있습니다.

 

 

 

1. float // IEEE 754 표준 부동 소수점

[ 부호 (1bit) + 지수 (8bit) + 가수 (23bit) = 32bit = 4byte ]

자료형 저장공간 설명 표현범위
float 32 bit 실수 -3.4x10^38 ~ 3.4x10^38

 

 

 

자바에서 기본적으로 사용하는 실수의 자료형은 double이며 float형식을 사용할떄에는 반드시 추가적으로 표기해주어야만 합니다.

 

1
2
3
4
5
6
public class Float {
    public static void main(String[] args) {
        float float1= 6.27;     // f 를 붙이지 않고 저장하면 컴파일 에러 발생!
        float float2= 6.27f;    // 3.14 실수 리터럴이 저장된다.
    }
}
cs

 

 

 

 

 

2. double // IEEE 754 표준 부동 소수점

[ 부호 (1bit) + 지수 (11bit) + 가수 (52bit) = 64 bit = 8byte ]

자료형 저장공간 설명 표현범위
double 64 bit 실수 -1.7x10^308 ~ 1.7x10^308

 

 

 

자바에서 사용하는 기본 실수형이 double이라 리터럴에 따로 명시하지 않아도 알아서 적용 됩니다.

1
2
3
4
5
6
public class Double {
    public static void main(String[] args) {
        double double1 = 6.27;  // d를 붙이지 않아도 자동적으로 자바에서 적용시켜준다 에러없음!
        double double2 = 6.27d; // d를 명시해도 무방!
    }
}
cs

 

 

 

 

 

 

상기 두 부동 소수점에는 큰 단점이 있습니다.

아래 코드를 실행 해보세요

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DoubleCal {
    public static void main(String[] args) {
        double n = 0.1;
        float n2 = 0.1f;
        for(int i = 0; i < 1000; i++) {
            n += 0.1;
            n2 = (float)n2 + 0.1f;
        }
        System.out.println(n);
        System.out.println(n2);
    }
}
 
cs

분명히 답은 100이 되어야 하나 

각각 출력된 결과는

double: 100.09999999999859
float: 100.099045

으로 부동소수점이 가진 표현방식의 한계로 오차가 발생하게 됩니다.

 

 

 

3. BigDecimal 객체 // 고정소수점

 

메모리가 허락하는 한 무제한의 사이즈를 가지고 있는 자료형입니다.

float과 double이 가진 오차가 없는, java에서 돈과 소수점을 다룬다면 필수로 사용해야하는 객체입니다.

BigDecimal의 유일한 단점은 느린 속도와 기본자료형보다 조금 불편한 사용방법 뿐입니다.

 

// 이번 포스트에서는 오차가 없다는 것만 증명하고 추후 따로 자세히 다루도록 하겠습니다.

 

 

 

증명을 위해 하단의 코드를 실행시켜보세요 

1
2
3
4
5
6
7
8
9
10
11
12
import java.math.BigDecimal;
 
public class BigDecimalCal {
    public static void main(String[] args) {
        BigDecimal decimal=new BigDecimal("0.0");
        BigDecimal decimal2=new BigDecimal("0.1");
        for(int i = 0; i < 1000; i++) {
            decimal = decimal.add(decimal2);
        }
        System.out.println(decimal);
    }
}
cs

아까 우리가 원했던 답인 100이 정확히 출력된 것을 볼 수 있습니다.

 

* BigDecimal 사용 시 주의사항

초기화 할 때 "" 스트링으로 초기화 하지 않으면, 오차가 발생할 수 있으니

반드시 "스트링" 형식으로 초기화 할 것.

 

'Backend > Java' 카테고리의 다른 글

7. Enum 형식  (0) 2021.07.13
6. byte, short, int, long 자료형 (정수 자료형)  (0) 2021.07.13
4. String 자료형  (0) 2021.07.11
3. Char 자료형  (0) 2021.07.11
2. Boolean 자료형  (0) 2021.07.11