☕️ JAVASCRIPT
자바스크립트에서 소수점 계산이 이상하다??
1HOON
2019. 8. 30. 23:33
자바스크립트에서 소수점 숫자를 덧셈 계산했을 때, 전혀 생각지도 못한 문제가 발생했다.
0.1 + 0.2 를 수행한 결과가 0.3이 아닌 0.30000000000000004 가 나오는 것이다!
다른 숫자를 더해봐도 결과는 마찬가지였다. 소수점 숫자끼리의 덧셈에서 정확한 값이 반환되지 않는것이다.
믿기지 않는다면 지금 바로 F12를 눌러 개발자도구를 열어 아래 코드를 실행해보자.
1
2
3
4
5
6
|
var a = 0.1;
var b = 0.2;
var result = a + b;
console.log(result);
|
cs |
결과는 본문과 같이 0.30000000000000004 일 것이다.
그래서 이렇게 포스팅을 하게되었다.
Javascript는 IEEE 754 를 기반으로 하고있기 때문에 64bit의 소숫점 숫자를 사용한다. 이것이 소수점 계산에서 정밀도 부분에 있어 오류를 발생시키는데, 십진법 기반의 숫자와 달리 컴퓨터는 이진법으로 동작하기 때문이다.
그렇다면 해결방법은 무엇이 있을까? 두 가지 해결 방법이 있는데, 모두 결과값을 반올림하는 매커니즘이다.
대부분의 경우 소수점 12번째 자리에서 반올림을 한다.
toFixed()
toFixed()는 대상 소수점 숫자를 매개변수만큼 자리수로 반올림해 String으로 반환해주는 함수이다.
1
2
3
4
5
6
|
var a = 0.1;
var b = 0.2;
var result = (a + b).toFixed(2);
console.log(result);
|
cs |
위 코드를 실행하면 0.30이 반환된다. 만약 result 를 바로 문자열이 아닌 숫자로 인식하면 계산식 맨 앞에 + 연산자를 붙이면된다.
1
2
3
4
5
6
|
var a = 0.1;
var b = 0.2;
var result = +(a + b).toFixed(2);
console.log(result);
|
cs |
이 코드에서는 0.3이 반환될 것이다.
1
2
3
4
5
6
|
var a = 0.1;
var b = 0.2;
var result = +(a + b).toFixed(12);
console.log(result);
|
cs |
Math.round()
Math.round()는 함수명에서 말해주듯이 반올림 함수이다.
1
2
3
4
5
6
|
var a = 0.1;
var b = 0.2;
var result = Math.round((a+b) * 100) / 100;
console.log(result);
|
cs |
1
2
3
4
5
6
|
var a = 0.1;
var b = 0.2;
var result = Math.round((a+b) * 1e12) / 1e12;
console.log(result);
|
cs |
참고 사이트
https://stackoverflow.com/questions/588004/is-floating-point-math-broken
반응형