JavaScript

[JavaScript] 자바스크립트 소수점 계산시 오류 발생????

bomoto 2021. 12. 10. 15:48
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으로 반환한다는 점을 주의해서 사용한다.