일반적으로 데이터는 숫자 데이터, 숫자가 아닌 데이터(문자,문자열 포함) 두가지 유형이 있다.
float 과 double은 숫자 데이터에 속하는데 숫자 데이터는 '정수'와 '부동 소수점 숫자'로 구성된다.
float 과 double은 모두 '실수'를 표현하기 위해 사용되는 자료형이다.
즉, 부동 소수점 숫자를 표현하는 데이터 유형이다.
학습목표
- float과 double의 차이
- 크기(Size)
- 정밀도(Precision)
- 저장방식
float과 double의 차이
크기(Size)
두 데이터 유형 모두 10진수로 숫자 표현하지만
float 32비트, double 64비트이다.(1비트 = 8바이트)
구분 | 데이터형 | 바이트 수 | 데이터 범위 |
정수 |
byte | 1Byte | -2⁷ ~ 2⁷-1 (-128~127) |
short | 2Byte | -2¹⁵ ~ 2¹⁵-1(-32768 ~ 32767) | |
int | 4Byte | -2³¹ ~ 2³¹ -1 | |
long | 8Byte | -2⁶³ ~ 2⁶³ -1 | |
실수 | float | 4Byte | -3.4 * 10³⁸ ~ 3.4 * 10³⁸ |
double | 8Byte | -1.7 * 10³⁰⁸ ~1.7 * 10³⁰⁸ | |
문자 | char | 2Byte | Unicode 문자 |
논리 | boolean | - | true or false |
정밀도(precision)
실수형 데이터 타입을 다룰 때 중요한 것은 '정밀도(precision)'이다.
하지만 정수형보다 실수형을 쓰면 훨씬 더 큰 값을 표현할 수 있지만, 오차가 발생할 수 있다
자료형 | 크기 | 범위 | 유효자릿수 | 비고 |
float | 4바이트, 32비트 |
1.175494e-38 ~ 3.4028 23e+38 |
7 | IEEE 754 단정밀도 부동소수점 |
double | 8바이트, 64비트 |
2.225074e-308 ~ 1.797693e+308 |
16 | IEEE 754 배정밀도 부동소수점 |
long double |
8바이트, 64비트 |
2.225074e - 308 ~ 1.797693e + 308 |
16 | IEEE 754 배정밀도 부동소수 |
유효자릿수가 뜻하는 것은 정밀도를 뜻하는데 오차없이 몇자리까지 표현 가능한지를 의미한다.
float은 7자리, double은 dobule이라는 용어대로 두 배의 비트 수를 할당하므로 15~16자리까지 표현 가능하다.
float보다 double의 정밀도가 더 높기 때문에 표현하려는 값의 크기에 따라 선택해서 사용하면 된다.
저장방식
정수형과 실수형은 저장방식이 다르다.
int형은 32비트 중 1비트 = 부호비트, 31비트는 값을 표현하는데 사용한다.
하지만 float 과 double은 부호, 지수, 가수로 나눠서 표현한다.
- 부호(Sign bit) : 0이면 양수, 1이면 음수
- 지수(Exponent): 부호있는 정수
- 가수(Mantissa): 실제 값을 저장하는 부분
부호(S) 1비트 | 지수(E) 필드 8비트 | 가수(M) 필드 23비트 |
▲단일-정밀도 형식(single-precision format) -> 32비트로 표현된 부동소수점 수(float)
부호(S) 1비트 | 지수(E)필드 11비트 | 가수(M) 필드 52비트 |
▲복수-정밀도 형식(double-precision format) -> 64비트로 표현된 부동소수점 수(double)
※참고
실수 중에 파이와 같이 무한소수가 존재한다.
정수와 달리 실수를 저장할 때는 오차가 발생할 수 있다.
10진수가 아닌 2진수로 저장하기 때문에 10진수로는 유한소수이더라도
2진수로 변환하면 무한소수가 되기 때문이다.
따라서 무한소수를 모두 저장할 수 없기 때문에 짤리거나 오차가 생기기도 한다.
소수점 단위의 정확한 연산이 필요한 서비스에는 float, double 대신 'BigDecimal'을 사용해야 한다.
'JAVA' 카테고리의 다른 글
[Java]클래스의 메서드 개념 (scanner.nextLine(); ) (0) | 2024.03.24 |
---|---|
[JAVA]변수와 자료형 (0) | 2024.03.19 |
IntelliJ 같은 프로젝트 다른 패키지 RUN이 안되는 문제 (0) | 2024.03.15 |
Disconnected from the target VM, address: '127.0.0.1:58685', transport: 'socket' (0) | 2024.03.04 |