컴퓨터는 실수를 표현하기 위한 방법은 다양하지만 대표적으로 고정 소수점(fixed point) 과 부동 소수점(floating point) 이다. 고정 소수점은 10진수를 2진수의 거듭 제곱 합으로 표현해 그대로 비트에 담아 사용하고, 부동 소수점은 2진수의 표현 방식과 비트를 사용하는 체계가 다르며 가장 널리 쓰이는 표준은 IEEE754 이다. IEEE754 는 normalization, 지수부 bias 추가 과정이 포함된다. 자바의 float 는 IEEE754 방식으로 관리되며, 1bit는 부호(sign), 8bit는 정수부(exponent), 23bit는 가수부(mantissa) 로 실수를 관리한다.
하지만 이 방식에는 단점이 존재한다. 고정 소수점, 부동 소수점 실수 부분에 관한 비트를 모두 사용하면 나머지 비트는 버리기 때문에 정확한 값 대신 근사치 값만 표현한다. 10진수를 2진수로 표현하는 과정에서 무한 소수 또는 가수 부분을 초과하는 소수가 변환되면 비트 외 부분은 사라져 근사치 값만 표현되기 때문에 금융권이나 공학 계산과 같은 정밀도가 높은 연산이 필요한 비즈니스에서는 부적합하다.
class Main {
public static void main(String[] args) {
System.out.println(1.00 - 9 * 0.10); // 0.09999999999999998
}
}
effective java 에서는 3가지 요소들을 권장한다.
- 소수점의 정밀한 연산을 위해서 BigDecimal 을 사용하자.
- 정수를 사용하는 경우, int(21억 이하), long(90경 이하) 을 사용하자.
- float 과 double 을 사용할 때는 == 을 사용하지 말자.
그리고 BigDecimal 을 사용할 때는 아래를 주의하자!
- BigDecimal 을 생성할 때, double 을 사용해서 생성하지 말자.
- 소수점을 표현한다면 RoundingMode 와 scale 를 고려해서 사용하자.
Reference
- CS50 - 고정 소수점(fixed point)과 부동 소수점(floating point)
- [지마켓] BigDecimal A to Z: 정확한 계산을 위한 숫자 처리 클래스
- 이펙티브 자바 Effective Java 3/E (아이템 60. 정확한 답이 필요하다면 float와 double은 피하라)
'java > summary' 카테고리의 다른 글
퍼사드 패턴(Facade Pattern) (0) | 2024.07.08 |
---|---|
커맨드 패턴(command pattern) (0) | 2024.07.08 |
책임 연쇄 패턴 (chain of responsibility pattern) (1) | 2024.07.05 |
싱글톤 패턴(singleton pattern) (0) | 2024.07.03 |
Garbage Collector simple summary (0) | 2024.03.04 |