Java에서는 부동 소수점 숫자를 표현하기 위한 두 가지 주요 유형이 있습니다: float (32비트)와 double (64비트). 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 값을
==연산자를 사용해 비교했는데 예상 외로 많은 "불일치"가 발생했습니다. 델타로 비교 방식으로 변경하자 프로그램의 논리가 올바르게 작동하게 되었습니다.