💡 부동소수점(Floating Point)이란?
부동소수점은 소수를 근사적으로 표현하기 위해 사용하는 컴퓨터의 수 표현 방식
컴퓨터는 이진수(0과 1) 만 다룰 수 있어서, 소수를 정확하게 표현하지 못하는 경우가 많음
이로 인해 부동소수점 오차(Floating Point Error) 가 발생할 수 있음
1️⃣ 부동소수점이 필요한 이유
정수를 표현할 때는 문제가 없지만, 소수(예: 0.1, 0.2, 3.14159) 같은 값은 2진수로 정확하게 표현하기 어렵다.
💡 예를 들어, 십진수 0.1을 이진수로 바꾸면
0.00011001100110011001100110011001100... (무한 반복)
무한히 반복되는 형태가 돼서 정확하게 저장할 수 없다
그래서 일정한 자릿수까지만 저장하고 근사값으로 저장하는 방식이 부동소수점 표현이다.
2️⃣ 부동소수점의 표현 방식 (IEEE 754 표준)
💡 부동소수점은 부호(1bit) + 지수(8bit) + 가수(23bit) 로 이루어져 있다.
(일반적인 float 타입 기준, double은 더 정밀함)
✅ 예시: 3.14를 부동소수점으로 표현하면
부호(S) 지수(E) 가수(M)
0 10000000 10010001111010111000011
- 부호(S): 0 (양수)
- 지수(E): 10000000 (8bit, 실제 지수는 E - 127)
- 가수(M): 10010001111010111000011 (유효 숫자 부분)
이 방식으로 숫자를 근사적으로 표현하게 됨
3️⃣ 부동소수점 오차가 발생하는 이유
부동소수점 오차는 컴퓨터가 실수를 근사값으로 표현하기 때문이.
예를 들어, 0.1 + 0.2를 계산하면 0.3이 아니라 0.30000000000000004 가 나오는 이유가 바로 이 때문!
public class FloatingPointError {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 0.30000000000000004
}
}
4️⃣ 부동소수점 오차 해결 방법
오차를 줄이는 방법은 여러 가지가 있다.
✅ 1. BigDecimal 사용하기 (Java)
import java.math.BigDecimal;
public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 정확한 0.3 출력!
}
}
📌 BigDecimal은 부동소수점 오차 없이 정확한 계산이 가능
✅ 2. 정수 연산을 활용하기
- double 대신 정수형 (int, long)으로 변환 후 계산
- 예를 들어 원 단위(100원, 200원)로 변환해서 계산한 후 다시 나누기
int a = 10; // 0.1을 10으로 변환
int b = 20; // 0.2를 20으로 변환
System.out.println((a + b) / 10.0); // 0.3 출력
📌 금융 계산처럼 정확성이 중요한 경우 자주 사용됨.
📌 결론
✔ 부동소수점은 실수를 근사적으로 표현하기 위한 방법이지만, 정확하지 않을 수 있음.
✔ 0.1, 0.2 같은 숫자는 2진수로 정확히 표현할 수 없어서 오차 발생
✔ BigDecimal 사용하거나, 정수형 연산으로 변환해서 해결 가능!
'ComputerScience > Java' 카테고리의 다른 글
(Java) int와 long 범위 (0) | 2025.03.10 |
---|---|
자연 정렬(Natural Ordering)이란? - Comparable, Comparator 예제 (0) | 2025.02.27 |
Java 객체비교 인터페이스 - Comparable, Comparator (0) | 2025.02.27 |
isNumeric()과 isDigit() : 문자가 숫자인지 확인 (+차이점) (0) | 2025.02.26 |
String vs StringBuffer, StringBuilder 차이점 (0) | 2025.02.24 |