수식 계산기
괄호·사칙연산·거듭제곱이 포함된 수식을 입력하면 결과를 계산합니다.
eval을 쓰지 않고 직접 만든 파서(Shunting-yard 알고리즘)로 수식을 해석합니다. 입력한 수식은 서버로 전송되지 않고 브라우저 안에서만 계산되며, 이력도 이 브라우저에만 저장됩니다.
수식 계산기란?
괄호, 거듭제곱, 삼각함수가 섞인 복잡한 수식을 한 번에 계산하고 싶을 때 사용합니다. 예를 들어 `sqrt(16) + 2 * (3+4)^2` 같은 식을 입력하면, 일반 계산기로는 여러 번 나눠서 해야 할 계산을 즉시 처리합니다. 사칙연산은 물론, `sin`, `cos`, `log` 같은 수학 함수와 `pi`, `e` 같은 상수까지 지원하는 강력한 온라인 계산기입니다. 입력하는 즉시 결과가 실시간으로 표시되며, 별도의 '계산' 버튼을 누를 필요가 없습니다. 모든 계산은 사용자의 브라우저 안에서만 안전하게 처리됩니다. 입력하신 수식은 서버로 전송되지 않으므로 민감한 수치도 안심하고 계산할 수 있습니다. 설치나 회원가입 없이 누구나 무료로 이용 가능합니다.
사용 방법
- 상단의 '수식 입력' 칸에 계산할 식을 입력합니다. 예: `2 * (10 + 5) / 3`
- 수식을 입력하는 동시에 하단 '결과' 칸에 계산 결과가 실시간으로 나타납니다.
- `pi`, `sqrt(`, `sin(` 등 자주 쓰는 함수와 상수는 키보드 아래 버튼을 눌러 간편하게 추가할 수 있습니다.
- 삼각함수 계산 시에는 'DEG/RAD' 버튼으로 각도 단위를 먼저 선택합니다.
- Enter 키를 누르면 현재 수식과 결과가 '계산 이력'에 저장되어 나중에 다시 불러올 수 있습니다.
- 결과값 우측의 '복사' 버튼을 누르면 계산 결과를 클립보드에 복사할 수 있습니다.
수식 계산기 사용 가이드
실제 작업에서 이 도구를 어떻게 쓰는지, 무엇을 조심해야 하는지 정리했습니다.
이 계산기가 파서를 직접 만든 이유
"2 * (3 + 4) ^ 2" 같은 문자열을 계산하는 가장 짧은 코드는 eval(수식) 한 줄입니다. 그런데 이 한 줄이 유명한 보안 구멍입니다. eval은 수식만 계산하는 함수가 아니라 문자열을 자바스크립트 코드로 실행하는 함수이기 때문입니다.
입력이 사용자에게서 오는 순간, 계산기는 "임의 코드 실행기"가 됩니다. 브라우저에서라면 페이지의 쿠키와 로그인 토큰을 긁어 외부로 보내는 코드가 실행되고(XSS), 서버에서 계산기 API를 eval이나 new Function 으로 만들었다면 더 심각합니다 — 파일을 읽고 명령을 실행해 서버를 통째로 넘겨줄 수 있습니다. 계산기 기능 하나 때문에 원격 코드 실행 취약점이 생기는 셈입니다.
그래서 이 도구는 eval도 new Function도 쓰지 않습니다. 수식을 토큰으로 쪼개고(토크나이저), Shunting-yard 알고리즘으로 연산 순서를 정리한 뒤, 허용된 함수와 연산자만 계산합니다. 정의되지 않은 이름이 나오면 실행이 아니라 오류입니다 — 그래서 alert(1) 을 넣으면 "모르는 이름"이라며 거절합니다.
0.1 + 0.2 를 넣어 보세요
이 계산기에 0.1 + 0.2 를 넣으면 0.3 이 나옵니다. 그런데 브라우저 콘솔에서 같은 계산을 하면 0.30000000000000004 가 나옵니다. 계산기가 틀린 걸까요? 아닙니다 — 둘 다 같은 값을 계산했고, 이 도구는 표시할 때만 다듬은 것입니다.
원인은 컴퓨터가 소수를 2진수로 저장하기 때문입니다. 10진수 0.1 은 2진수로 옮기면 무한소수라서 어딘가에서 잘라야 하고, 그 미세한 오차가 더할 때 드러납니다. 자바스크립트만의 문제가 아니라 부동소수점을 쓰는 거의 모든 언어에서 똑같이 일어납니다. 이 도구는 결과를 유효숫자 12자리로 정리해 보여주기 때문에 잡음이 가려지는 것뿐, 내부 계산의 오차는 그대로 남아 있습니다.
돈 계산은 어떻게 해야 하나
원칙은 하나입니다 — 돈은 소수로 다루지 말고 정수로 다루세요. 원 단위 정수로 계산하고, 나눗셈이 필요한 지점에서만 반올림·절사 규칙을 명시적으로 적용합니다.
부가세가 대표적입니다. 총액 29,000원에서 공급가액을 뽑으면 29000 / 1.1 = 26363.636… 입니다. 여기서 원 단위를 버릴지 반올림할지는 수학이 아니라 회사와 세무 규정이 정하는 문제입니다. 계산기가 대신 정해줄 수 없고, 코드에서 그 규칙을 한 곳에 모아 두어야 합니다.
- DB 컬럼은 FLOAT·DOUBLE 대신 DECIMAL을 쓰세요. 금액에 FLOAT을 쓰는 것은 흔하지만 위험한 실수입니다.
- 자바스크립트에서 금액을 다룬다면 원 단위 정수로 환산하거나 전용 라이브러리를 쓰세요.
- 나눗셈 결과를 그대로 쌓지 말고, 각 단계에서 반올림 규칙을 확정한 뒤 다음 계산으로 넘기세요.
- 이 계산기는 검산과 어림에 쓰기 좋습니다. 정산 로직 자체를 여기서 굴리지는 마세요.
자주 걸리는 문법 다섯 가지
오류 메시지는 몇 번째 글자 부근인지까지 알려줍니다. 그래도 아래는 원인을 모르면 한참 헤매는 것들입니다.
| 입력 | 결과 | 이유 |
|---|---|---|
| 2(3+4) | 오류 | 곱셈 기호를 생략할 수 없습니다. 2*(3+4) 로 쓰세요 |
| 30 % 5 | 0 | %는 백분율이 아니라 나머지입니다. 30% 할인은 30/100 |
| 2^3^2 | 512 | 거듭제곱은 오른쪽부터. 2^(3^2)=2^9 입니다 |
| -2^2 | -4 | 거듭제곱이 부호보다 먼저라 -(2^2) 로 해석됩니다 |
| log(100) | 2 | log는 상용로그(밑 10). 자연로그는 ln(x) 입니다 |
큰 수의 한계와 이력 기능
결과가 9,007,199,254,740,991(2의 53제곱 빼기 1)을 넘으면 마지막 자리는 근삿값이라는 경고가 뜹니다. 자바스크립트의 숫자 형식이 그 이상의 정수를 정확히 표현하지 못하기 때문입니다. 2^100 같은 계산도 값은 나오지만 정확한 정수가 아닙니다 — 정확한 큰 수 계산이 필요하면 파이썬이나 BigInt를 지원하는 환경을 쓰세요.
수식을 입력하고 Enter를 누르면 계산 이력에 저장됩니다. 최대 10개까지 남고, 항목을 클릭하면 그 수식이 입력창으로 돌아옵니다. 비슷한 계산을 조건만 바꿔가며 반복할 때 편합니다.
- 이력과 마지막 입력은 이 브라우저에만 저장됩니다. 서버로 전송되지 않고 다른 기기에서는 보이지 않습니다.
- 공용 PC에서 민감한 숫자를 계산했다면 "이력 지우기"를 누르고 나오세요.
- 0으로 나누기, 음수의 제곱근, tan(90°) 처럼 정의되지 않는 계산은 이상한 값(Infinity·NaN)을 내놓지 않고 오류로 잡아 줍니다.
- 칩 버튼(pi, sqrt(, round( 등)은 커서 위치에 그대로 삽입됩니다. 함수 이름을 외울 필요는 없습니다.
자주 묻는 질문
어떤 연산과 함수를 지원하나요?
사칙연산(+, -, *, /), 거듭제곱(^), 나머지(%)와 괄호를 기본 지원합니다. 그뿐만 아니라 제곱근(sqrt), 로그(log, ln), 삼각함수(sin, cos, tan), 절댓값(abs), 올림/내림(ceil/floor) 등 다양한 수학 함수와 상수(pi, e)를 사용할 수 있습니다. 지원하는 전체 목록은 페이지 하단의 '지원 함수 · 상수' 표에서 확인하실 수 있습니다.
입력한 수식 데이터는 안전하게 처리되나요?
네, 매우 안전합니다. 이 도구는 모든 계산을 사용자의 웹 브라우저 내부에서 직접 처리합니다. 입력하신 수식은 외부 서버로 일절 전송되지 않으며, '계산 이력' 역시 현재 사용 중인 브라우저에만 저장됩니다. 민감한 정보나 중요한 계산도 안심하고 사용하셔도 좋습니다.
삼각함수는 어떻게 계산하나요?
sin, cos, tan 등 삼각함수를 계산할 때는 먼저 각도 단위를 선택해야 합니다. 수식 입력창 위의 'DEG/RAD' 버튼으로 단위를 설정할 수 있습니다. 'DEG'를 선택하면 90도와 같은 일반 각도 단위로, 'RAD'를 선택하면 라디안 단위로 계산합니다. 예를 들어 `sin(90)`은 DEG 모드에서 `1`을, RAD 모드에서는 `0.89...`를 반환합니다.
계산 결과가 지수 형태로 나옵니다. 왜 그런가요?
계산 결과의 절댓값이 매우 크거나 작을 경우, 더 정확하고 간결하게 표현하기 위해 자동으로 지수 표기법(예: `1.23e+15`)으로 표시됩니다. 자바스크립트가 표현할 수 있는 정밀도를 넘어서는 큰 정수(약 9007조 이상)는 마지막 자리가 근삿값일 수 있다는 점 참고해 주십시오.