[TIL] 2020. 05. 12. Math_Round

달밤·2020년 5월 12일
0

TIL

목록 보기
9/110
post-thumbnail

자바스크립트 소수점 계산

1. 문제

오늘 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 라고 나온다.

2. 해결방법

이 이슈를 해결하기 위해서는 저렇게 무지막지하게 나온 결과값을 반올림해서 내가 원하는 값으로 변환해야 한다.

1. toFixed() 메소드

let longNumber = 0.1 + 0.05 ;		//0.15000000000000002
longNumber.toFixed(2);				//'0.15'

대상 숫자(longNumber)를 매개변수(2))만큼의 소수점 자리 수로 반올림하는 메소드.

단 이 경우 결과값이 숫자가 아니라 스트링 값으로 나오기 때문에,

숫자로 이용하기 위해서는 스트링타입을 숫자타입으로 형변환을 시켜주어야 한다.

2. Math.round() 메소드

let longNumber = 0.1 + 0.05 ;		//0.15000000000000002
Math.round(longNumber*100)/100;				//0.15

원래는 소수점 첫번째 자리에서 반올림하는 메소드인데,

이걸 100을 곱했다가 100으로 나누면 소수점 둘째자리 수로 표현된다.

1000을 곱했다가 1000으로 나누면 소수점 셋째자리, 그 이상까지도 표현 가능하다.

오늘 하루

  1. 생각보다 알고리즘 문제를 빨리 풀어서 신남!! 하지만 문제만 풀었을 뿐 여전히 체화가 안된 것들도 많아서 오늘 내일 복습하면서 체화를 시켜야겠다.
  2. 최근에 체중이 조금 늘어서 저녁먹고 운동 나갔다 왔는데, 운동하고나니 식욕이 올라서 만두를 삶아먹었네..? 내일부터 다시 다이어트 시작 .....
profile
다 늦은 밤, 달밤의 개발일기

0개의 댓글