console.log(0.1 + 0.2);
console.log(0.2 * 6);
위의 두 출력 결과는 어떻게 나올까?
실행해보면 결과는 각각 0.30000000000000004 이랑 1.2000000000000002 으로 예상과는 다른 숫자를 도출해낸다.
이건 자바스크립트의 오류인걸까?
결론부터 말하자면 자바스크립트 언어의 오류는 아니다.
전에 타입을 써야하는 이유에 대해 쓴 글을 읽어보면 그 이유를 알 수 있다.
2021.11.24 - [프로그래밍] - 타입을 사용하는 이유
타입을 사용하는 이유
컴퓨터의 숫자 표현 방법 인류는 10진수를 사용하고 컴퓨터는 2진수를 사용한다. 컴퓨터도 같이 10진수를 사용하면 기계어를 다룰 때 더 편할 텐데 왜 그렇게 되었을까? 숫자를 디지털로 변환할
bomoto.tistory.com
컴퓨터는 실수의 연산을 할 때 정수의 연산과는 다르게 부동소수점 방식으로 저장된 이진수 데이터로 연산을 한다.
이 이진수는 32자리를 나눠서 소수의 정보를 저장한다.
그런데 소수가 무한소수가 되어버리면 32자리로 표현할 수 있는 범위를 넘어가게된다.
그렇게되면 컴퓨터는 어쩔수없이 계산 결과를 저장할 수 있는 값 까지만 저장하는데 이때 데이터 초과되거나 손실되는 상황이 벌어질 수 있다.
그래서 위와 같은 상황이 벌어지는 것이다.
그렇다면 이런 상황을 해결하려면 어떻게 해야할까?
가장 기초적인 방법으로 연산하려는 소수점을 정수로 변환한다음 다시 소수점으로 바꾸는 방법이 있다.
console.log(((0.1 * 10) + (0.2 * 10)) / 10);
console.log(((0.2 * 10) * 6) / 10);
위와 같이 소수점을 정수로 만들어준다음 정수의 계산을 소수점으로 변환하면 0.3과 1.2로 의도한 값이 나온다.
하지만 이 방법은 너무 복잡하고 식을 읽기가 번거롭다.
그러니 다음 방법을 사용해보자.
toFixed() 메서드 사용
toFixed는 소수점을 표현하고 싶은 자리까지만 나타내준다.
console.log((0.1+0.2).toFixed(1)); // 0.3
console.log((0.2*6).toFixed(1)); // 1.2
console.log(typeof (0.2*6).toFixed(1) ); // string
toFixed메서드는 값을 string으로 반환한다는 점을 주의해서 사용한다.
'JavaScript' 카테고리의 다른 글
JavaScript와 비교한 TypeScript의 특징과 장점 (0) | 2021.12.10 |
---|---|
[JavaScript] 이벤트 루프: 자바스크립트는 싱글 스레드라면서 왜 비동기 방식인가요? (0) | 2021.12.10 |
[JavaScript] == vs === (동등 연산자와 동치 연산자) (0) | 2021.12.10 |
[JavaScript] 익명 함수, 화살표 함수에 대해(함수 선언식과 함수 표현식) (0) | 2021.12.10 |
[JavaScript] 읽기쉬운 코드를 위해서 const를 사용하자: const, let, var에 대해 (0) | 2021.12.10 |