☕ Java

Double과 Float를 사용하면 안되는 이유

date
Jul 27, 2023
slug
why-not-use-double-float
author
status
Public
tags
Java
BigDecimal
summary
double, float 자료형과 BigDecimal의 차이를 알아봅시다
type
Post
thumbnail
제목을-입력해주세요_-001.png
category
☕ Java
updatedAt
Aug 2, 2023 05:40 AM
Java에서 소수를 표현할 때 보통 double이나 float 형식의 자료형을 사용합니다.
 
java 관련 강의를 듣는데 강사님께서 이런말씀을 하시더군요.
double과 float 대신 BigDecimal 자료형을 사용하세요
왜 이런 말씀을 하시고 왜 doublefloat 대신 BigDecimal을 사용해야 하는지 알아봅시다.
 

부동소수점 연산의 정확도 문제

floatdouble 은 부동소수점으로 값을 표현하다보면, 소수점 이하의 값이 정확하게 표현이 안되는 오류가 발생합니다.
double a = 1.03; double b = 0.42; System.out.println(a - b); // 결과: 0.6100000000000001
위에서 보여지는 코드와 같이 연산이 실행되면, 연산의 기댓값인 0.61이 출력되는게 아닌 이상한 값이 출력됨을 확인 할 수 있습니다.
그 이유는 부동소수점 표현으로 인한 한계 때문인데, 소수 자리수가 굉장히 큰 경우 혹은 무한 소수의 값을 저장하는 경우 적절한 표기를 위해 표준에 맞춰서 근사값의 형태로 값을 표현하기 때문입니다.
 
이러한 문제를 해결하기 위해서 BigDecimal 을 사용합니다.
 

BigDecimal

BigDecimal a = new BigDecimal("1.03"); BigDecimal b = new BigDecimal("0.42"); System.out.println(a.subtract(b)); // 결과: 0.61
이렇게 BigDecimal 을 이용하면, 정확한 결괏값을 얻을 수 있습니다.
이것이 가능한 이유는, BigDecimal 자료형의 범위는 double 보다 더 넓고, 또 근삿값을 이용한 표현방식이 아닌, 유효숫자와 소수점을 기준으로 표현하기 때문입니다.
 
그래서 돈을 계산하거나 금융 프로젝트 등에서 소수를 사용할 때는 꼭 BigDecimal 을 사용해야 합니다.
 

어디가. Double, Float 버려?

 
notion image
 
그렇담 우리가 지금까지 잘 사용해온 double, float는 정말 사용하지 않을까요?
BigDecimal 은 불변 객체 (immutable) 입니다. 값을 새로 선언할 때 마다, 메모리에 저장됩니다.
그래서 메모리를 많이 소모하게 되고, 또 그러한 이유 때문에 연산 속도도 double , float에 비해 느립니다.
 
따라서 소수를 더 많이 다루거나 정확한 값을 요할 때에는 BigDecimal
메모리를 절약하고 빠른 연산을 위해서는 double / float 를 상황에 맞게 사용할 줄 알아야겠습니다.