본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 정확한 계산에는 float 이나 double 타입을 쓰지 말자.

by 돼지왕 왕돼지 2017. 1. 31.
반응형

 [Effective Java] 정확한 계산에는 float 이나 double 타입을 쓰지 말자.


18자리, 9자리, BigDecimal, bigdecimal 단점, Double, Effective JAVA, float, iNT, long, [Effective Java] 정확한 계산에는 float 이나 double 타입을 쓰지 말자., 근사치, 넓은 범위, 단점, 돈 계산, 반올림, 반올림 모드, 부적당, 불편, 비용, 설계, 성능, 성능 저하, 실행 속도, 연산, 이진 부동소수점, 자릿수, 정확한 결과, 정확한 계산, 추가 장점, 타입


-
float, double 은 이진 부동소수점 연산을 수행하는데, 넓은 범위의 수에 대해 정확한 근사치를 빨리 산출하기 위해 설계되었다.
그러나 정확한 결과를 제공하지 않으므로, 근사치가 아닌 정확한 결과가 필요한 곳에 사용하면 안된다.
float 과 double 타입은 돈 계산에는 특히 부적당하다.


-
돈 계산할 때 올바른 답을 구하려면 BigDecimal, int, long 타입 중 하나를 사용해야 한다.


-
BigDecimal 은 정확한 연산을 제공하지만 두 가지 단점이 있다.
    1. 기본 데이터 타입을 사용할 떄보다 불편하다.
    2. 실행 속도가 느려진다.


-
BigDecimal 을 사용하지 않으려면, int 나 long 으로 소숫점을 없앤 형태로 계산해야 한다.
예를 들어 25.35 유로는 2535 센트로 치환해서 계산하고, display 할 때만 25.35 로 다시 보여주는 것이다.



Summary


근사치가 아닌 정확한 결과가 필요한 계산에서는 float 이나 double 타입을 사용하지 않는다.
만일 시스템에서 소수점 계산과 유지를 해주길 원하고, 사용의 불편함과 기본형 데이터 타입을 사용하지 않는데 따른 비용(성능저하)을 개의치 않는다면 BigDecimal 을 사용하자.
BigDecimal 은 반올림이 수반되는 연산 할 떄 8가지의 반올림 모드를 이용해 완벽히 반올림 제어를 할 수 있는 추가 장점이 있다.
만일 성능이 중요하고 소수점을 우리가 직접 계산하고 유지해도 괜찮으며, 너무 큰 수를 다루는 것이 아니라면 int 나 long 타입을 사용하자.
취급하는 수의 크기가 십진수 9자리를 넘지 않으면 int 타입을 사용할 수 있고, 18자리를 넘지 않으면 long 타입을 사용할 수 있으며, 18자리를 초과하면 BigDecimal 을 사용해야 한다.





반응형

댓글