왜 int랑 double은 바로 비교가 안될까?

박화랑·2025년 3월 4일
0

Spring_6기

목록 보기
8/15

✅ 문제 상황

  • 특정 값과 동일한 값을 검색하는 기능을 구현했음
  • 그러나 filterResultsByEqual(double target) 메서드에서 intdouble을 비교할 때 검색 결과가 반환되지 않는 문제 발생
  • 예를 들어, 리스트에 124.0이 존재하지만 124를 입력하면 검색 결과가 나오지 않음

원인 분석

1. 부동소수점 비교 문제

  • Java에서 부동소수점(double)과 정수(int)는 다르게 저장됨
  • intdouble을 직접 비교할 경우 암묵적 형 변환이 일어나면서 오차가 발생할 수 있음
  • 공식 문서(Oracle Java Docs - Floating-Point Arithmetic)에 따르면, 부동소수점 연산은 정확성이 떨어지므로 직접 비교하면 예상과 다른 결과가 나올 수 있음
System.out.println(124 == 124.0); // true (자동 형 변환)
System.out.println(Double.compare(124, 124.0)); // 0 (정확한 비교 가능)

2. 기존 코드에서 발생한 문제

기존 코드 (filterResultsByEqual)

public List<Double> filterResultsByEqual(double target) {
    return results.stream()
            .filter(value -> value == target)  // ❌ `int`와 `double` 비교 문제 발생
            .collect(Collectors.toList());
}

이전 코드에서는 == 연산자를 사용하여 직접 비교
🚨 하지만 intdouble 비교 시 예상치 못한 결과 발생!


해결 방법

Double.compare() 사용하여 정확한 비교 수행

  • 공식 문서(Double.compare() - Java Docs 참고)
  • Double.compare(x, y)부동소수점과 정수를 정확하게 비교해 주는 메서드
  • 0을 반환하면 두 값이 동일한 것으로 간주됨
public List<Double> filterResultsByEqual(double target) {
    return results.stream()
            .filter(value -> Double.compare(value, target) == 0)  // ✅ 정확한 비교 수행
            .collect(Collectors.toList());
}

✅ 해결 후 정상 동작 확인

입력값 및 저장된 리스트

📜 현재 저장된 연산 결과: [0.7924, 166.0, -31.0, 124.0, 4.4375]

실행 테스트

기준값을 입력하세요 ('n' 입력 시 뒤로 가기): 124
✅ 검색 결과: [124.0]

정확한 값 매칭이 가능해짐!


최종 정리

문제 원인해결 방법
== 연산자로 intdouble을 비교하면서 예상과 다른 결과 발생Double.compare() 사용하여 정확한 비교 수행
int를 입력했을 때 double로 변환되지 않아서 검색이 실패함double로 변환 후 Double.compare()를 활용하여 비교

결론:

  • 부동소수점 비교 문제를 방지하려면 Double.compare() 사용이 필수!
  • 공식 문서를 참고하여 문제 해결 과정과 원인을 정확히 파악하는 것이 중요하다!
profile
개발자 희망생

0개의 댓글

관련 채용 정보