EEALL@ONCE
☕ 자바 자료형 - 실수형+ 실수형 부동소수점 오차 (실수형) 본문
실수형 + 실수형은 왜 오차를 만들어낼까?
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/3을 2진수로 변환하려면 2로 나누는 과정을 반복해야 합니다.
- 처음에는 0.5로 시작합니다. (2의 -1승)
- 0.5를 2로 나누면 0.25가 됩니다. (2의 -2승)
- 0.25를 2로 나누면 0.125가 됩니다. (2의 -3승)
- 이 과정을 무한히 반복하면서 2진수로 정확하게 표현할 수 없습니다.
3. 이 근사치로 인해 작은 오차가 발생합니다:
- 따라서, 컴퓨터는 실수를 정확하게 표현할 수 없고, 작은 오차가 발생하게 됩니다. 이렇게 작은 오차들이 산술 연산을 수행할 때 누적되어 더 큰 오차가 발생합니다.
예를 들어, 0.1을 이진수로 정확히 표현하려면 무한한 자릿수가 필요하지만, 컴퓨터는 한정된 자릿수로 표현합니다. 따라서 0.1의 이진수 표현은 근사치로 표현되며, 이 근사치로 인해 작은 오차가 발생합니다.
이와 같은 부동소수점 오차를 최소화하기 위해 정확한 결과가 필요한 경우에는 `BigDecimal`과 같은 정확한 10진수 연산을 지원하는 자료형을 사용하면 됩니다. 그렇지 않은 경우, 일반적인 부동소수점 연산을 사용해도 큰 문제가 없을 수 있습니다. 하지만 중요한 계산에서는 부동소수점 오차에 유의하여 처리해야 합니다.
'언어💻 > 자바☕' 카테고리의 다른 글
☕ 자바 자료형 - float은 왜 f를 붙여야 인식할까 ? (실수형) (0) | 2023.08.01 |
---|---|
☕ 자바 자료형 - double/float (실수형) (0) | 2023.08.01 |
☕ 자바 자료형 -증감 연산자(Increment and Decrement Operators) (정수형) (0) | 2023.08.01 |
☕ 자바 자료형 -byte+byte / short+short (정수형) (0) | 2023.08.01 |
☕ 자바 자료형 - 형변환 casting (정수형) (0) | 2023.07.31 |