[JavaScript] 소수점 제어 및 부동소수점 에러

 

자바스크립트에서 소수점을 제어하려고 할때는 아래 기능을 사용한다.

Q1. 소수점을 버리는 방법 3가지

var result = Math.floor(1.123456); //1 (숫자)
result = Math.floor(-9.1234); //-10 (숫자)


var result = parseInt(1.123456); //1 (숫자)
result = parseInt(-9.1234); //-9 (숫자)

var result = 1.123456;
result.toString().split(".")[0]; //1 (문자)
result = -9.1234;
result.toString().split(".")[0]; //-9 (문자)

 

Q2. 소수점을 n자리수 표시하는 방법 3가지

var result = 1.123456.toFixed(2); //1.12 (숫자)
result = -9.1264.toFixed(2); //-9.13 (숫자)


var result = Math.floor(1.123456 * 100) / 100; //1.12 (숫자)
result = Math.ceil(-9.1264 * 100) / 100; //-9.13 (숫자)

var result = 1.123456;
result.toString().split(".")[0];
result = result.toString().split(".")[0] +"."+result.toString().split(".")[0].slice(0,2);

여기서 split를 이용한 방법은 문자열 기능이기때문에 결과값이 문자열이다.

따라서 별도 연산이 필요한 경우 Number로 숫자를 형변환시켜야한다.

참고로 자바스크립트 연산을 하면서 발생했던 증상을 추가로 작성한다.

 

Q3. 부동소수점 오류에 관하여

부동소수점 오류란, 자바스크립트에서만 발생되는 오류만은 아니다.
정의내리면 소수점이 있는 수를 계산하다보면 결과값에 오류가 발생하는 것을 의미한다.
연산식을 처리할 때, 10진법은 컴퓨터가 이해하기 쉽게 2진법으로 변환되어 계산된다고 한다.
그런데, 몇 소수들은 2진법으로 변환하는 과정에서 무한소수가 되고, 컴퓨터가 이 한계를 담지 못한다.
따라서 중간에 짤라서 유한 소수로 저장하게되고, 이로 인해 미세한 오차가 발생한다고 한다.

예를 들자면, 0.1 + 0.2 = 0.3이 나와야하는데 0.300000000004가 나오는 문제가 있다.
이를 해결하려면 소수점 올림/내림/반올림과 같은 별도의 계산없이 있는 그대로의 값을 표시하기 위해
(0.1 + 0.2).toFixed(2)와 같이 정상적으로 계산되어 문자타입의 0.3으로 반환된다.
다만 숫자타입으로 추출하기위해서는 별도의 파라미터 없이 toFixed()를 또 사용하거나 Number형변환하면 된다.

 

 

Q4. 결론적으로

소수점 버리기/표시하기를 정리하자면 스크립트에서 아래와 같이 사용한다.