ComputerScience/Java

부동소수점(Floating Point)이란? (Java)

imachill7guy 2025. 3. 8. 17:49

💡 부동소수점(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 사용하거나, 정수형 연산으로 변환해서 해결 가능!