본문으로 바로가기

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

컴퓨터는 0, 1로 표현을 하기 때문에 소수점을 정확하게 나타낼 수 없다. 그래서 소수점 연산을 할 때, 소수점 아래 숫자들에게 문제가 발생하는 경우가 자주 있다. 그럼 소수점 사칙연산을 할 때 어떻게 하면 될까? 간단하게 자바스크립에서 소수점 사칙연산 하는 방법을 알아보자.

소수점 사칙연산 문제점

여기서는 덧셈, 뺄셈만 확인을 해볼 것이다. 해당 내용을 이해한다면 곱하기, 나누기는 자연스럽게 이해가 될 것이다.

자바스크립트 소수점 덧셈

소수점 덧셈을 한번 해보자. 1.2 + 3.5 = ? . 해당 연산의 결과는 뭐가 나올까? 당연히 4.7이 나올 것이라고 생각할 것이다. 그럼 그렇게 나올까?

역시 우리가 생각한 것처럼 4.7로 잘 나온다. 그럼 문제가 없을까? 1.22 + 2.3 = ? . 이 연산은 값이 뭐가 나올까? 3.52가 나올까?

첫번째 연산과는 다르게 3.52가 나오지 않고 3.519~ 가 나왔다. 왜 그럴까? 컴퓨터는 0, 1로 표현하기 때문에 소수점을 정확히 표현할 수 없기 때문이다. 그럼 빼기도 한번 알아보자.

자바스크립트 소수점 뺄셈

3.1 - 1.1 = ? . 해당 연산은 어떤 값이 나올까?

다행히 2로 정상적인 값이 나왔다. 그럼 2.3 - 1.22 = ? . 해당 연산은 어떨까?

1.079~ 로 우리가 생각하는 값이랑 다르게 나왔다. 우선 원인은 컴퓨터 표현 방식이라는 것을 알겠는데 어떻게 해결할 수 있을까? 간단하게 알아보자.

소수점 사칙연산 해결방법

소수점이 문제라면 소수점을 없애주면 된다. 무슨 말이냐? 위 결과가 잘못 나온 예시들로 알아보자. 1.22 + 2.3을 해결해보자. 우선 소수점 depth가 더 큰 것으로 기준을 삼으면 된다. 1.22가 더 깊으니 1.22로 기준을 세우고 계산하면 된다. 1.22를 정수로 만드는 방법은 100을 곱하는 것이다. 그리고 이 100을 2.3에도 곱해주자. 1.22 * 100 + 2.3 * 100 = 122 + 230 = 352 가 된다. 여기서 곱한 100을 다시 나누어주면 된다. 그럼 3.52로 우리가 원하는 값이 나오게 된다. 컴퓨터로 돌려보자.

우리가 예상한 값대로 3.52가 나왔다. 뺄셈도 똑같다. 2.3 - 1.22 에서 1.22를 기준으로 삼으면 된다. 2.3 * 100 - 1.22 * 100 = 230 - 122 = 108. 108을 100으로 나누면 1.08로 우리가 원하는 값이 나올까?

1.07이 나왔다. 왜 그럴까? 사실 필자도 좀 놀라긴했다. 다음 게시글에서 알아보자.

이번 게시글에서 말하고자 하는 것은 소수점 계산은 정확하지 않다. 그리고 소수점 계산을 정확하게 하는 방법은 소수점을 없애주는 것이다.

마지막

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

반응형