float 과 double
float과 double은 부동소수점 데이터 타입으로, 이진 부동 소수점을 표현해 실수를 표현합니다.
이러한 데이터 타입은 이진 부동 소수점의 한계로 인해 정확한 비교가 어려울 수 있습니다. 따라서 == 연산자를 사용하여 부동 소수점 값을 비교할 때 문제가 발생할 수 있습니다.
부동 소수점이란?
부동소수점은 실수를 컴퓨터에서 근사적으로 표현하기 위한 방법 중 하나입니다.
컴퓨터는 이진수 체계로 데이터를 처리하는데, 실수를 표현하기 위해 이진 부동소수점 형식을 사용합니다.
부동 소수점은 소수점이 고정되어 있지 않고 좌우로 움직일 수 있다는 뜻을 말합니다.
즉, 소수점을 자유롭게 움직일 수 있어 표현할 수 있는 수의 범위가 매우 넓어집니다.
부동 소수점은 소수를 부호, 지수부, 가수부로 나눠 표현합니다.
1.xxxx * 2^n 방식으로 저장됩니다.
고정 소수점이란?
고정 소수점 방식은 메모리를 정수부와 소수부로 고정으로 나누고 지정하여 처리하는 방식입니다.
즉, 소수부의 자릿수를 미리 정하고 고정된 자릿수의 소수를 표현합니다.
고정 소수점은 직관적으로 메모리에 실수 표현을 할 수 있지만, 표현 가능한 범위가 적다는 단점을 가지고 있습니다.
12.345 이렇게 직관적으로 저장됩니다.
그래서 왜 == 연산을 쓰면 안되는데?
먼저 이유를 알기 위해선 무한 소수를 알아야한다.
모든 십진수 실수를 깔끔하게 2진수로 변환할 수 는 없다.
딱 소수점이 떨어지면 상관없지만, 무한으로 반복되는 이진수 실수는 큰수를 저장하는 부동 소수점 방식이라 해도 무한대를 저장할 수 없으니, 결국 어느순간 끊어 반올림을 해주어야 한다.
즉, 컴퓨터의 메모리는 한정적이기 때문에 실수의 소숫점을 표현할 수 있는 수의 제한이 존재한다.
숫자 제한이 있다는 것은 부정확한 실수의 계산값이 발생할 수 있다는 것이다.
수 자체의 크기로서는 크게 차이가 안나는 것 같지만, 정밀한 프로그램에서는 이 오차가 큰 영향을 끼칠 수 도 있기 때문에 정확한 계산이 필요하다.
결론적으로, 부동 소수점은 오차를 가지고 있고, 실수 자료형의 == 연산을 사용하는 것은 정확한 비교를 보장하지 않습니다.
해결 방법으로는 다음과 같은 방법이 있습니다.
- equals() 메서드 사용 : 부동소수점 오차렬 고려한 비교를 수행합니다.(Float, Double 클래스)
- BigDecimal 을 사용해 정확한 십진 부동소수점 방식을 사용합니다.
'Back-end' 카테고리의 다른 글
ArrayList vs LinkedList vs Array (0) | 2023.08.16 |
---|---|
hashCode() (0) | 2023.08.16 |
Primitive Type vs Wrapper Class + Wrapper Class 동일성 비교 (0) | 2023.08.16 |
동일성 vs 동등성 (0) | 2023.08.16 |
static vs static final vs final In Java (0) | 2023.08.15 |