본문으로 바로가기

[JavaScript] 소수점 사칙연산 처리하기 - 3

소수점 사칙연산 처리하기 - 1에서 마지막에 확인한 2.3 - 1.22 가 잘 되지 않았다. 왜 그럴까? 확인해보니 2.3 * 100 이 잘 되지 않았다. 2.3 * 100의 결과가 230이 나와야 하는데 229.9~로 나왔다. 이놈의 부동소수점이 골칫덩어리다. 그럼 어떻게 해결할 수 있을까. 고민하다가 String으로 변환하여 소수점을 없애고 계산하면 될 것 같아 시도해보았다. 아래 함수를 확인해보자.

# 소수점 없애기

필자는 소수점 2째자리까지만 표현이 가능한 기능을 개발 중이라 소수점 3째자리부터는 n자리인지 확인하는 규칙을 넣어주는 게 더 좋은 방법일 것 같다. 구현한 함수는 아래와 같다.

const removeDecimalPoint = number => {
  const decimal = String(number).split(".")[1];
  const newNumber = Number(String(number).replace(".", ""));

  if (!Boolean(decimal)) return newNumber * 100;

  const length = decimal.length;
  if (length === 1) return newNumber * 10;
  return newNumber;
};

우선 숫자가 소수점인지 확인한다. 소수점이 없는 경우 100을 곱하고 return, 1자리인 경우 10을 곱하고 return, 2자리인 경우 소수점만 없애고 return 을 해주었다. 이해가 되는가? 기존 공식이랑 똑같은데 방법만 다르다. 소수점 없애는 것을 replace 작업으로 해주었고 * 값 은 이전 규칙이랑 동일하다. 그럼 2.3 - 1.22가 잘 되는지 확인해보자.

우리가 원하는 결과 1.08이 잘 나오게되었다. n자리의 경우는 어떻게 해결할 수 있을지 위 removeDecimalPoint 함수를 확인해보고 간단하게 n자리 구하는 공식을 추가하면 좋을 것 같다.

마지막

해당 내용은 틀릴 수도 있다는 것을 감안하여 봐주세요. 틀린 내용 및 오탈자 수정 요청 환영입니다.

반응형