저는 회사에서 회계, 예산 프로그램을 담당하고 있어서 금액을 계산하는 작업이 다수인데
가끔 '분명히 맞는데 왜 이상하게 나오지..?' 싶을 때가 있어서 찾아보다 알게된 내용들입니다!
부동소수점: 좌표 등 약간의 오차가 중요하지 않은 데이터에서 사용
고정소수점: 금액 등 정확한 값이 필요한 경우에 사용
0.1 + 1.1 == 1.2 => false
인 이유
컴퓨터가 숫자를 저장할 때 한 숫자당 32bit의 공간을 마련함
소수를 저장할 때 (IEEE 형식)
일반적으로 0.125와 같은 숫자를 2진수로 변환하면 0.001 과 같이 깔끔하게 딱 떨어져서 변환 가능하지만
0.1 과 같이 깔끔하게 변환되지 않고 0.000110011001001 …. 과 같이 1001이 무한히 이어지는 순환소수가 되는 경우가 있는데
숫자를 저장할 때 32bit를 넘어가면 뒷 부분을 자르고 메모리에 숫자를 저장하게 됩니다.
-> 그래서 자른 부분만큼 오차가 발생함
// npm decimal 을 통한 라이브러리 설치
let number = 0.1;
let transNumber = new Decimal(number).add(1.1).toString();
let errorNumber = number + 1.1;
console.log("> 라이브러리 사용해서 부동소수점 확인 ", transNumber == 1.2);
console.log("> 일반 연산 부동소수점 확인 ", errorNumber == 1.2);