EEALL@ONCE

☕ 자바 자료형 - 실수형+ 실수형 부동소수점 오차 (실수형) 본문

언어💻/자바☕

☕ 자바 자료형 - 실수형+ 실수형 부동소수점 오차 (실수형)

올엣원스 2023. 8. 1. 14:10
728x90

실수형 + 실수형은 왜 오차를 만들어낼까?

double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c);

---------------------------
결과 값
0.30000000000000004

 

🐭 :

부동소수점을 이해하기 위해서는 컴퓨터가 숫자를 저장하는 방식을 이해해야 합니다.

1. 컴퓨터는 2진수를 사용합니다:
   - 2진수는 0과 1로 이루어진 숫자 체계입니다. 컴퓨터는 이진수로 모든 데이터를 표현하고 저장합니다.

2. 10진수를 2진수로 변환하면 근사치가 됩니다:
   - 컴퓨터가 10진수를 2진수로 변환할 때, 정확한 값으로 표현하기 어렵습니다. 이는 우리가 1/3을 소수점 아래 무한한 자릿수로 나타낼 수 없는 것과 비슷합니다.

예제: 1/3을 10진수로 표현하면 0.33333333...과 같이 무한 소수로 나타낼 수 있습니다. 이것은 1/3을 정확하게 표현하기 위해 무한한 자릿수가 필요함을 의미합니다.

이제 이를 2진수로 변환해보겠습니다.

1/3을 2진수로 변환하는 방법:

  1. 1/3을 2진수로 변환하려면 2로 나누는 과정을 반복해야 합니다.
  2. 처음에는 0.5로 시작합니다. (2의 -1승)
  3. 0.5를 2로 나누면 0.25가 됩니다. (2의 -2승)
  4. 0.25를 2로 나누면 0.125가 됩니다. (2의 -3승)
  5. 이 과정을 무한히 반복하면서 2진수로 정확하게 표현할 수 없습니다.

3. 이 근사치로 인해 작은 오차가 발생합니다:
   - 따라서, 컴퓨터는 실수를 정확하게 표현할 수 없고, 작은 오차가 발생하게 됩니다. 이렇게 작은 오차들이 산술 연산을 수행할 때 누적되어 더 큰 오차가 발생합니다.

예를 들어, 0.1을 이진수로 정확히 표현하려면 무한한 자릿수가 필요하지만, 컴퓨터는 한정된 자릿수로 표현합니다. 따라서 0.1의 이진수 표현은 근사치로 표현되며, 이 근사치로 인해 작은 오차가 발생합니다.

이와 같은 부동소수점 오차를 최소화하기 위해 정확한 결과가 필요한 경우에는 `BigDecimal`과 같은 정확한 10진수 연산을 지원하는 자료형을 사용하면 됩니다. 그렇지 않은 경우, 일반적인 부동소수점 연산을 사용해도 큰 문제가 없을 수 있습니다. 하지만 중요한 계산에서는 부동소수점 오차에 유의하여 처리해야 합니다.

 

728x90