☕️ 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

 

Is floating point math broken?

Consider the following code: 0.1 + 0.2 == 0.3 -> false 0.1 + 0.2 -> 0.30000000000000004 Why do these inaccuracies happen?

stackoverflow.com

 

반응형