본문 바로가기
Back-end

왜 float과 double은 == 연산을 사용하면 안될까?

by 신재권 2023. 8. 16.

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