오늘 Math.sqrt()메소드를 사용하지않고 제곱근의 근사값을 구하는 알고리즘을 풀고 있었다.
또 근사값은 소수점 둘째자리까지만 구하라는 조건이 있어서 다음과 같이 코드를 짰다.
function computeSquareRoot(num) {
let value = 0;
while(num > value * value){
value = value + 0.01;
}
return value;
}
while 반복문이 작동되는 동안, value값이 0.01씩 증가하면 결과 값은
당연히 X.XX와 같이 소수점 둘째짜리 수일 줄 알았다.
하지만 결과는 참혹했다.
이 함수에 9라는 수가 입력되었을때,
value값은 무려 3.00999999999998이 나왔다.
이 무슨?? 🤯
3이라는 정수 값이 나오거나, 그것도 아니라면 2.99나 3.01이 나와야 정상인데.
이게 어떻게 된 일인지 알아보니.
자바스크립트에는 소수점 이슈가 있는데, 소수점으로 된 숫자들을 정확하게 파악하지 못한다는 것.
일례로 콘솔에서 실험해보면,
0.1 + 0.05의 값은 0.15가 아니라, 0.15000000000000002 라고 나온다.
이 이슈를 해결하기 위해서는 저렇게 무지막지하게 나온 결과값을 반올림해서 내가 원하는 값으로 변환해야 한다.
let longNumber = 0.1 + 0.05 ; //0.15000000000000002
longNumber.toFixed(2); //'0.15'
대상 숫자(longNumber)를 매개변수(2))만큼의 소수점 자리 수로 반올림하는 메소드.
단 이 경우 결과값이 숫자가 아니라 스트링 값으로 나오기 때문에,
숫자로 이용하기 위해서는 스트링타입을 숫자타입으로 형변환을 시켜주어야 한다.
let longNumber = 0.1 + 0.05 ; //0.15000000000000002
Math.round(longNumber*100)/100; //0.15
원래는 소수점 첫번째 자리에서 반올림하는 메소드인데,
이걸 100을 곱했다가 100으로 나누면 소수점 둘째자리 수로 표현된다.
1000을 곱했다가 1000으로 나누면 소수점 셋째자리, 그 이상까지도 표현 가능하다.