0.1 + 1.2를 계산하면 얼마가 나와야 할까요?
수학을 배웠다면 1.3이라고 답했을 겁니다.
하지만 실제로 컴퓨터를 통해 계산해 보면 아래와 같은 결과가 나옵니다.
1.3과 a+b의 값을 비교했을 때
우리가 생각한 것과 다르게 false가 나왔습니다.
왜 이런 문제가 발생할까요?
컴퓨터는 2진법을 통해 계산을 합니다.
이때 소수들의 경우 완벽하게 떨어지지 않는, 무한소수들이 존재하는데,
정해진 메모리 공간 아래 무한한 자리수들을 표기 할 수 없으므로
이를 처리하는 과정에서 오차가 발생하게 됩니다.
간단히 말하면 a에 정확하게 0.1이 저장된 게 아닌
0.1과 가까운 값이 저장된 상태라고 이해하시면 됩니다.
그럼, 오차 없는 완벽한 계산은 못 하나요?
다행이도 이를 위해 언어마다 라이브러리를 제공하고 있습니다.
- Java : BigDecimal 모듈
- JavaScript : big.js 등
- 파이썬 : decimal 모듈
유니티 에서는
Mathf.Approxiamately() 함수를 사용하여 비교하면 더 정확하게 계산할 수 있습니다.
ex) Mathf.Aprroxiamately(a+b, 1.3)
얼핏 봐서는 올바르게 동작할 것 같아 놓치기 쉬운 문제였습니다.
결론 : 되도록 정수를 사용하자.
참고하면 좋은 자료
https://youtu.be/-GsrYvZoAdA?si=05RSy8lt4r0TnniF
https://youtu.be/ZQDsWySjY6g?si=QATdPTS5kOIrHOS7
'알고리즘' 카테고리의 다른 글
자료구조 - 트리(Tree)에 대해 알아보자(w. 순회(Traversal)방법) (0) | 2024.12.19 |
---|