🎈결론
인간은 숫자를 표현하기 위해 혹은 연산을 하기위해 10진법을 사용하지만
컴퓨터는 2진법을 사용하기 때문에
그 차이에서 비롯된 오차때문이다.
우리가 12라는 숫자를 컴퓨터에 입력하면
컴퓨터에서는 내부적으로 해당 숫자를 1100(이진법)으로 변환하여 처리한다.
우리가 소수 0.75를 입력하면
컴퓨터에서는 0.11(이진법)으로 변환하여 처리한다.
🎈 그럼 왜 2진수로 표현하는데 오차가 생길까?
0.1(십진법)을 이진법으로 변환하게 되면
0.0001100110011001100110011001....... 과 같이 무한 소수로 정확하게 떨어지지 않는다.
컴퓨터의 메모리는 무한하지 않기 때문에
표현할 수 있는 최대한의 범위 내에서
가장 근접한 값으로 반올림 처리하여 우리에게 결과를 보여준다.
그리고 이로 인해 위와 같은 오차가 발생하는 것이다.
🎈 이럴 때 BigDecimal 이 필요하다.
자료형 | float | double |
크기 | 4byte | 8byte |
범위 | -3.4*10^38 ~ 3.4*10^38 | -1.7*10^308 ~ 1.7*10^308 |
유효자릿수 | 소수점 7번째 까지 유효 | 소수점 16번째까지 유효 |
- float, double은 부동소수점에 의해 2진수로 값을 변환하는데 이로 인해 정확한 값이 아닌 근사치를 표현해준다.
이처럼 정밀도의 한계로 값이 유실되는 경우가 있는데 이를 방지할 때 BigDecimal을 사용한다.
- float, double에 비해 BigDecimal은 더 많은 크기의 실수를 저장할 수 있으며 10진수로 값을 받기에 정확한 값을 보여준다.
- 돈 계산과 같이 정확한 값이 필요한 작업을 할 때 사용한다.
- 하지만 float, double에 비해 속도가 느리다는 단점이 있다.
- BigDecimal은 문자열이기에 사칙연산이 안 된다. 이 때문에 클래스 내부 메서드를 사용한다.
'Programming > 프로그래밍 내용 정리' 카테고리의 다른 글
[AWS야 제발 친해지자] VPC / 서브넷 / 인터넷 게이트웨이 / 라우팅 테이블 / 로드밸런싱 (0) | 2023.02.03 |
---|---|
[보안] SQL Injection / PreparedStatement / Statement (1) | 2022.09.13 |
[네트워크] OSI7계층이 뭔가요? (0) | 2022.08.15 |
[네크워크] TCP와 UDP의 차이점이 뭔가요? 소켓 프로그래밍이 뭔가요? (0) | 2022.08.14 |
System.out.println()의 원리가 무엇인가요? (0) | 2022.08.09 |