프로그래밍Java 개발자

Java에서 float와 double 데이터 유형을 사용할 때의 특성은 무엇인가요? 각각을 언제 적용해야 하며, 부동 소수점 숫자를 사용할 때의 잠재적인 문제는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

Java에서는 부동 소수점 숫자를 표현하기 위한 두 가지 주요 유형이 있습니다: float (32비트)와 double (64비트). float는 정밀도가 낮고 메모리를 적게 차지하며, double은 더 높은 정밀도를 제공하고 부동 소수점 숫자에 대한 기본 권장 유형입니다.

  • float 사용 시기: 메모리 사용량에 대한 엄격한 요구가 있을 경우 (예: 배열의 많은 숫자, 자원이 제한된 장치).
  • double 사용 시기: 특별한 제한이 없는 경우 거의 항상 사용합니다. double은 더 나은 정밀도를 제공합니다.

중요한 특징:

  • 부동 소수점 연산은 반올림 오류를 누적시킬 수 있습니다.
  • float/double 비교 시 ==를 사용하지 마십시오. 오차를 고려한 비교를 사용해야 합니다.

델타 비교 예시:

public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("오차를 고려하여 같음"); } else { System.out.println("서로 다름"); } } }

함정 질문

질문: 다음 코드는 어떤 결과를 출력할까요?

System.out.println(0.1 + 0.2 == 0.3);

답변: 이 코드는 false를 출력합니다. 0.1 + 0.2의 결과는 IEEE 754 이진 형식에서 정확히 0.3과 같지 않기 때문에 부동 소수점과 double 유형에서 10진 소수 저장 방식의 특성 때문입니다.

주제에 대한 지식 부족으로 인한 실제 오류 예시


이야기

한 대형 금융 프로젝트에서 double 유형으로 자산 카운터를 사용했습니다. 실제로 작은 연산들이 종종 반올림 오류를 축적해 결국 최종 합계가 몇 센트씩 달라지는 결과가 발생했습니다. 문제는 double을 BigDecimal로 교체함으로써 해결되었습니다.


이야기

게임 엔진에서 오브젝트의 좌표를 저장하기 위해 float 배열을 사용했는데, 큰 값의 세계에서 큰 거리로 이동할 때 오브젝트의 위치 정밀도가 떨어져 화면에서 오브젝트가 "떨리는" 문제가 발생했습니다. float를 double로 교체하고 좌표를 중앙에 배치함으로써 문제가 해결되었습니다.


이야기

통계 분석 프로그램에서 double 값을 == 연산자를 사용해 비교했는데 예상 외로 많은 "불일치"가 발생했습니다. 델타로 비교 방식으로 변경하자 프로그램의 논리가 올바르게 작동하게 되었습니다.