일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- vscode
- Linux
- mpcview
- 자바스크립트
- 오라클데이터베이스
- 엘리멘트
- 프론트엔드
- github
- 시스템에러
- Signature
- 설치
- JavaScript
- oracle database
- https://www.w3schools.com/
- HTML
- frontend
- js
- Method
- 삼항연산자
- oracle
- 오라클 데이터베이스
- 인텔리제이 #intelliJ #JetBrains
- MalwareZero
- java
- 오라클 로그
- 오라클
- CentOS
- 스타일테그
- Android
- CSS
- Today
- Total
개발
5. float, double, Bigdecimal 자료형 (실수 자료형) 본문
안녕하세요
실수 자료형에 관해 설명 하겠습니다.
자바가 지원하는 기본자료형 중 실수형은 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 |