let sum = 0.1 + 0.2
console.log(sum);
위 코드를 출력해보면 0.3이 나올것 같은데 그게아닌 0.3에 가까운 숫자가 출력된다.▼
이러한 현상은 파이썬,루비,자바등 대부분의 프로그래밍 언어에서도 똑같이 발생한다.
왜 이런 현상이 발생하는 것일까?
부정확한 숫자 계산의 가장 큰 원인은 사람과 컴퓨터 사이에 숫자를 다루는 방식이 서로 다르기 때문이다.
컴퓨터의 모든 코드는 0과 1로만 이루어져 있다는 것을 한번쯤 들어봤을텐데
실제로도 여태 작성한 코드들은 어떤 특별한 과정을 거쳐서
0과 1로 이루어진 2진수로 변환된 다음에 컴퓨터가 해석을 하는데,
3분의 1이라는 분수를 소수로 표현하려다 보면 0.33333....으로 무한 소수가 되는 경우가 있다.
비슷한 원리로 일반적으로 사용하는 10진수의 소수 표현을 2진수로 바꿔서 계산하다보면
무한 소수가 되는 경우가 발생한다.
그런데 이 무한소수는 말 그대로 숫자가 무한히 이어지기 때문에 딱 명확하게 표현할 수 있는 방법이 없다.
그래서 자바스크립트가 숫자를 표현할 수 있는 범위 내에서 특정한 자리에서 숫자를 반올림 해버리는데,
여기서 발생하는 아주 미세한 값의 차이가 바로 오차로 발생하는 것이다.
이제 이 오차를 해결하려면
앞서배운 "toFixed" 메소드를 활용해서 필요한 자릿수에 맞춰서 반올림되게끔 만들어준다.
let sum = 0.1 + 0.2
console.log(sum.toFixed(1);
그런데 toFixed 메소드의 결과는 문자열이라고 했으므로
숫자로 사용하려면 앞서 배운 형 변환을 하면 된다.
//문자열에서 숫자형으로 형변환
console.log(Number(sum.toFixed(1)));
console.log(+sum.toFixed(1));
또한 Math 객체의 round 메소드를 활용하는 방법도있다.
//Math 객체의 round 메소드 활용
console.log(Math.round(sum * 10) / 10);
필요한 소수점 자리수만큼의 10의 거듭제곱을 곱해서 먼저 정수로 만들어주고
round 메소드로 계산을 한다음 다시 10만큼 나눠주는 방식을 활용한 것이다.
방법이야 여러가지 있지만 대표적인 두 가지 방법(.toFixed()),(Math.round()) 만 적었다.
3분의 1을 명확한 10진수로 완벽하게 다루지 못하듯이
2진수로 변환했을 때 무한소수로 나타나는 계산 오류를 완벽하게 방지하는 방법은 사실상 없다.
필요한 상황에 따라 적절한 수로 반올림하는 방법밖에 없으며
언제 어떤 식으로 이 오차를 다루는 게 좋을지 한번 생각 해 보는 것이 좋을 듯하다.
★Notion 주소 (이자 계산)
https://purrfect-gargoyle-935.notion.site/113e9530b3e180029f81dbcb2073ff1c?pvs=4
'JS' 카테고리의 다른 글
(38) JavaScript - 자료형(심화) / 기본형과 참조형 (0) | 2024.10.04 |
---|---|
(37) JavaScript - 자료형(심화) / 문자열 접근 (0) | 2024.10.03 |
(35) JavaScript - 자료형(심화) / Math 객체 (0) | 2024.10.02 |
(34) JavaScript - 자료형(심화) / 숫자형 메소드(toFixed, toString) (0) | 2024.10.02 |
(33) JavaScript - 자료형(심화) / 숫자 표기법 (0) | 2024.10.02 |