Calculator
왜 이 스킬이 필요한가
언어 모델은 긴 곱셈, 연쇄 퍼센트, 단위 환산에서 조용히 틀립니다. 틀린 답이 그럴듯하게 보이기 때문에 사용자가 잡아내기 어렵습니다. 그래서 이 스킬의 규칙은 하나입니다: 숫자는 머리로 계산하지 말고 코드로 계산한다.
계산 엔진은 이 스킬 기준 디렉토리의 scripts/calc.py입니다 (스킬 로드 시 안내되는 절대 경로 사용). 표준 라이브러리만 쓰므로 설치할 것이 없습니다.
python "<skill-dir>/scripts/calc.py" "1234 * 5678"
python이 없으면 python3로 시도하세요. 처음 쓸 때 동작이 의심되면 --selftest로 33개 검증을 돌려볼 수 있습니다.
작업 흐름
- 식으로 옮긴다. 사용자의 말을 하나의 식으로 번역합니다. 중간값을 손으로 계산해 다음 단계에 넣지 마세요 — 한 줄에 이어 붙이거나
-v로 변수를 넘기면 반올림 오차가 끼어들 여지가 없습니다.
- 실행한다. 여러 값이 필요하면
-(stdin) 배치 모드로 한 번에 처리합니다.
- 자릿수를 확인한다. 결과의 크기가 상식과 맞는지 봅니다. 어긋나면 단위나 퍼센트 해석을 잘못한 것이지 산술 실수가 아닙니다 — 식을 다시 읽으세요.
- 식과 함께 답한다. 사용자가 검증할 수 있도록 사용한 식을 보여주고, 반올림했다면 어디서 했는지 밝히세요. 큰 수를 문장에 인용할 때는
--comma로 자리수를 끊어 받아 그대로 옮겨 적으세요 — 자릿수를 눈으로 세다가 틀리는 걸 막아줍니다.
정확한 값과 반올림한 값이 다를 때는 둘 다 제시하는 편이 안전합니다. 예: "정확히는 1,085,342.7원, 원 단위로 끊으면 1,085,343원."
기본 사용법
# 단일 식
python calc.py "8_400_000 * 1.037**12"
# 자리수 구분 (문장에 인용할 때)
python calc.py --comma "2**100"
# 변수 (중간 반올림 방지)
python calc.py -v pv=250000000 -v apr=3.62 "pmt(pv, apr/12, 360)"
# 여러 줄 배치 - 앞 줄에서 정의한 변수를 뒷 줄에서 쓸 수 있음
printf 'net = 12500000\nvat = net * 0.1\nnet + vat\n' | python calc.py -
# 유효숫자 / 소수점 자리 지정
python calc.py --sig 6 "sqrt(2) * 100"
python calc.py --dp 2 "1000 / 7"
# 기계가 읽을 출력
python calc.py --json "pct(37, 250)"
연산 모드
| 모드 |
언제 쓰나 |
--mode decimal (기본) |
돈, 퍼센트, 일상적인 십진 계산. 0.1 + 0.2가 정확히 0.3이고, 정수만 나오는 연쇄 계산은 임의 정밀도 정수로 처리돼 2**100도 끝자리까지 맞습니다. |
--mode exact |
1/3 같은 순환소수가 중간에 끼는 계산. 분수로 유지하고 답을 1/2 (≈ 0.5) 형태로 함께 보여줍니다. |
--mode float |
다른 프로그램(엑셀, JS, C)이 낸 값을 재현해야 할 때만. IEEE-754 부동소수점 오차까지 똑같이 재현합니다. |
십진 기본값이 대부분의 실무 계산에서 옳습니다. float 모드는 "왜 이 프로그램이 이런 값을 냈나"를 설명할 때만 꺼내세요.
기본 작업 정밀도는 50자리이고 --precision으로 올릴 수 있습니다.
퍼센트
퍼센트는 조용한 오답이 가장 많이 나오는 곳입니다. 직접 *1.1, /1.1을 쓰기보다 의도가 이름에 드러나는 함수를 쓰세요 — 나중에 답변을 읽는 사람도 무엇을 계산했는지 알 수 있습니다.
| 함수 |
의미 |
예 |
pct(part, whole) |
part는 whole의 몇 %인가 |
pct(37, 250) → 14.8 |
pctof(p, whole) |
whole의 p% |
pctof(15, 84000) → 12600 |
pctchange(old, new) |
증감률 (%) |
pctchange(80000, 95000) → 18.75 |
addpct(x, p) |
x에서 p% 증가 |
addpct(1000, 8.5) → 1085 |
subpct(x, p) |
x에서 p% 감소 |
subpct(1000, 8.5) → 915 |
grossup(net, rate) |
세액 포함 금액 (기본 10%) |
grossup(10000) → 11000 |
netof(gross, rate) |
세액 제외 금액 |
netof(11000) → 10000 |
taxpart(gross, rate) |
포함된 세액만 |
taxpart(11000) → 1000 |
주의할 함정 두 가지. ① p% 올린 뒤 다시 p% 내려도 원래 값이 아닙니다 (addpct → subpct는 손실). 원래 값으로 되돌리려면 netof류 역산을 쓰세요. ② "20% 할인 후 10% 추가 할인"은 30% 할인이 아니라 28%입니다 — 순차 적용해야 하므로 subpct(subpct(x, 20), 10)로 씁니다.
함수 목록
--functions로 전체 목록을 볼 수 있습니다. 자주 쓰는 것들:
- 반올림·정리 —
round(x, 자리수) (사사오입, 기본), round(x, n, 'half_even') (은행식), sig(x, 유효숫자), floor, ceil, trunc, abs
- 거듭제곱·로그 —
sqrt, cbrt, root(x, n), exp, ln, log10, log2, log(x, base)
- 삼각 —
sin/cos/tan, asin/acos/atan/atan2, hypot, 각도 변환은 rad(도), deg(라디안)
- 금융 —
pmt(원금, 기간이자율%, 기간수) 원리금균등 상환금, fv(현재가치, 이자율%, 기간), pv(미래가치, 이자율%, 기간), cagr(시작, 끝, 기간) → %
- 통계 —
sum, mean, median, mode, stdev(표본), pstdev(모집단), variance, min, max, count, range, prod
- 정수 —
fact, comb(n,k), perm(n,k), gcd, lcm, isprime
- 환산 —
conv(값, '단위', '단위') — 식 안에서 환산이 필요할 때
금융 함수의 이자율은 퍼센트, 기간당 값입니다. 연 3.62% 30년 월납이면 pmt(원금, 3.62/12, 360)입니다. 0.0362를 그대로 넣으면 답이 100배 어긋나니 단위를 반드시 확인하세요.
round의 기본은 사사오입(half-up)입니다 — 대부분의 사람이 "반올림"이라고 할 때 기대하는 동작이고, Python 내장 round의 은행식과 다릅니다. 회계 규정상 은행식이 필요하면 'half_even'을 명시하세요.
삼각함수와 stdev 계열은 내부적으로 부동소수점을 거치므로 유효숫자 약 15자리입니다. 그 이상의 정밀도가 필요한 상황이면 사용자에게 알리세요.
단위 환산
python calc.py --convert 100 km mi # 62.1371192237334... mi
python calc.py --convert 33 평 m2 --dp 2 # 109.09 m2
python calc.py --convert 1 GiB MB # 1073.741824 MB
python calc.py --convert 98.6 f c # 37 c
지원 차원: 길이, 무게, 면적, 부피, 시간, 데이터, 속도, 압력, 에너지, 각도, 힘, 온도. 한국 전통 단위(평, 마지기, 돈, 근, 관, 냥, 되, 홉, 말, 자, 리)도 들어 있습니다. 전체 이름은 --units로 확인하세요.
데이터 단위는 대소문자를 구분합니다: MB(10⁶) ≠ MiB(2²⁰), Mb(메가비트) ≠ MB(메가바이트). 사용자가 "메가"라고만 말했다면 어느 쪽인지 확인하거나, 가정을 명시하고 답하세요.
차원이 다른 환산(kg → m)이나 모호한 이름은 추측하지 않고 오류를 냅니다. 오류가 나면 사용자가 실제로 무엇을 원했는지 다시 읽어보라는 신호입니다.
날짜 계산
python calc.py --date-diff 2026-07-30 2026-12-25 # 148 days (21.1429 weeks, 0.4052 years)
python calc.py --date-add 2026-07-30 100 # 2026-11-07 (Saturday)
날짜 차이는 윤년을 포함해 실제 달력으로 계산합니다. --date-add는 요일까지 알려주므로 마감일이 주말에 걸리는지 바로 확인할 수 있습니다. YYYY-MM-DD, YYYY/MM/DD, YYYY.MM.DD를 모두 받습니다.
실무 예제
세금·대출·투자수익·통계·큰 수 등 구체적인 계산 레시피는 references/recipes.md에 있습니다. 사용자 요청이 단순 산술을 넘어 여러 단계를 밟아야 할 때 그 파일을 읽으세요.
한계
- 기호 대수(방정식 풀이, 미분, 인수분해)는 지원하지 않습니다. 필요하면 그렇게 말하고 다른 방법을 제안하세요.
- 환율, 주가, 물가지수 같은 실시간 데이터는 들어 있지 않습니다. 사용자가 값을 주거나 별도 조회가 필요합니다.
- 세율·상환 방식은 나라와 상품마다 다릅니다. 이 스킬은 산술을 보장하지만 규정 해석은 보장하지 않습니다 — 가정한 세율·방식을 답변에 명시하세요.
1---2name: calculator3description: 숫자 계산을 암산 대신 Python으로 정확하게 실행합니다. 사칙연산, 큰 수 곱셈, 퍼센트/증감률/부가세, 단위 환산(길이·무게·면적·부피·평·돈·온도·데이터), 날짜 차이, 대출 상환금·복리·CAGR, 평균·중앙값·표준편차, 팩토리얼·조합·최소공배수를 다룹니다. 사용자 요청에 숫자와 연산이 함께 등장하면 - "얼마야", "몇 퍼센트", "총합", "몇 배", "환산", "며칠", "월 상환금", "평균" 같은 표현을 포함해 - 계산기라고 명시하지 않아도 반드시 이 스킬을 사용하세요. 표·견적·재무 모델의 숫자를 검산할 때도 사용하세요. 코드베이스에 계산 로직을 구현하는 작업(함수 작성, 버그 수정)에는 사용하지 마세요.4license: MIT5---67# Calculator89## 왜 이 스킬이 필요한가1011언어 모델은 긴 곱셈, 연쇄 퍼센트, 단위 환산에서 **조용히** 틀립니다. 틀린 답이 그럴듯하게 보이기 때문에 사용자가 잡아내기 어렵습니다. 그래서 이 스킬의 규칙은 하나입니다: **숫자는 머리로 계산하지 말고 코드로 계산한다.**1213계산 엔진은 이 스킬 기준 디렉토리의 `scripts/calc.py`입니다 (스킬 로드 시 안내되는 절대 경로 사용). 표준 라이브러리만 쓰므로 설치할 것이 없습니다.1415```bash16python "<skill-dir>/scripts/calc.py" "1234 * 5678"17```1819`python`이 없으면 `python3`로 시도하세요. 처음 쓸 때 동작이 의심되면 `--selftest`로 33개 검증을 돌려볼 수 있습니다.2021## 작업 흐름22231. **식으로 옮긴다.** 사용자의 말을 하나의 식으로 번역합니다. 중간값을 손으로 계산해 다음 단계에 넣지 마세요 — 한 줄에 이어 붙이거나 `-v`로 변수를 넘기면 반올림 오차가 끼어들 여지가 없습니다.242. **실행한다.** 여러 값이 필요하면 `-`(stdin) 배치 모드로 한 번에 처리합니다.253. **자릿수를 확인한다.** 결과의 크기가 상식과 맞는지 봅니다. 어긋나면 단위나 퍼센트 해석을 잘못한 것이지 산술 실수가 아닙니다 — 식을 다시 읽으세요.264. **식과 함께 답한다.** 사용자가 검증할 수 있도록 사용한 식을 보여주고, 반올림했다면 어디서 했는지 밝히세요. 큰 수를 문장에 인용할 때는 `--comma`로 자리수를 끊어 받아 그대로 옮겨 적으세요 — 자릿수를 눈으로 세다가 틀리는 걸 막아줍니다.2728정확한 값과 반올림한 값이 다를 때는 둘 다 제시하는 편이 안전합니다. 예: "정확히는 1,085,342.7원, 원 단위로 끊으면 1,085,343원."2930## 기본 사용법3132```bash33# 단일 식34python calc.py "8_400_000 * 1.037**12"3536# 자리수 구분 (문장에 인용할 때)37python calc.py --comma "2**100"3839# 변수 (중간 반올림 방지)40python calc.py -v pv=250000000 -v apr=3.62 "pmt(pv, apr/12, 360)"4142# 여러 줄 배치 - 앞 줄에서 정의한 변수를 뒷 줄에서 쓸 수 있음43printf 'net = 12500000\nvat = net * 0.1\nnet + vat\n' | python calc.py -4445# 유효숫자 / 소수점 자리 지정46python calc.py --sig 6 "sqrt(2) * 100"47python calc.py --dp 2 "1000 / 7"4849# 기계가 읽을 출력50python calc.py --json "pct(37, 250)"51```5253## 연산 모드5455| 모드 | 언제 쓰나 |56|---|---|57| `--mode decimal` (기본) | 돈, 퍼센트, 일상적인 십진 계산. `0.1 + 0.2`가 정확히 `0.3`이고, 정수만 나오는 연쇄 계산은 임의 정밀도 정수로 처리돼 `2**100`도 끝자리까지 맞습니다. |58| `--mode exact` | `1/3` 같은 순환소수가 중간에 끼는 계산. 분수로 유지하고 답을 `1/2 (≈ 0.5)` 형태로 함께 보여줍니다. |59| `--mode float` | 다른 프로그램(엑셀, JS, C)이 낸 값을 **재현**해야 할 때만. IEEE-754 부동소수점 오차까지 똑같이 재현합니다. |6061십진 기본값이 대부분의 실무 계산에서 옳습니다. float 모드는 "왜 이 프로그램이 이런 값을 냈나"를 설명할 때만 꺼내세요.6263기본 작업 정밀도는 50자리이고 `--precision`으로 올릴 수 있습니다.6465## 퍼센트6667퍼센트는 조용한 오답이 가장 많이 나오는 곳입니다. 직접 `*1.1`, `/1.1`을 쓰기보다 의도가 이름에 드러나는 함수를 쓰세요 — 나중에 답변을 읽는 사람도 무엇을 계산했는지 알 수 있습니다.6869| 함수 | 의미 | 예 |70|---|---|---|71| `pct(part, whole)` | part는 whole의 몇 %인가 | `pct(37, 250)` → `14.8` |72| `pctof(p, whole)` | whole의 p% | `pctof(15, 84000)` → `12600` |73| `pctchange(old, new)` | 증감률 (%) | `pctchange(80000, 95000)` → `18.75` |74| `addpct(x, p)` | x에서 p% 증가 | `addpct(1000, 8.5)` → `1085` |75| `subpct(x, p)` | x에서 p% 감소 | `subpct(1000, 8.5)` → `915` |76| `grossup(net, rate)` | 세액 포함 금액 (기본 10%) | `grossup(10000)` → `11000` |77| `netof(gross, rate)` | 세액 제외 금액 | `netof(11000)` → `10000` |78| `taxpart(gross, rate)` | 포함된 세액만 | `taxpart(11000)` → `1000` |7980**주의할 함정 두 가지.** ① `p%` 올린 뒤 다시 `p%` 내려도 원래 값이 아닙니다 (`addpct` → `subpct`는 손실). 원래 값으로 되돌리려면 `netof`류 역산을 쓰세요. ② "20% 할인 후 10% 추가 할인"은 30% 할인이 아니라 28%입니다 — 순차 적용해야 하므로 `subpct(subpct(x, 20), 10)`로 씁니다.8182## 함수 목록8384`--functions`로 전체 목록을 볼 수 있습니다. 자주 쓰는 것들:8586- **반올림·정리** — `round(x, 자리수)` (사사오입, 기본), `round(x, n, 'half_even')` (은행식), `sig(x, 유효숫자)`, `floor`, `ceil`, `trunc`, `abs`87- **거듭제곱·로그** — `sqrt`, `cbrt`, `root(x, n)`, `exp`, `ln`, `log10`, `log2`, `log(x, base)`88- **삼각** — `sin`/`cos`/`tan`, `asin`/`acos`/`atan`/`atan2`, `hypot`, 각도 변환은 `rad(도)`, `deg(라디안)`89- **금융** — `pmt(원금, 기간이자율%, 기간수)` 원리금균등 상환금, `fv(현재가치, 이자율%, 기간)`, `pv(미래가치, 이자율%, 기간)`, `cagr(시작, 끝, 기간)` → %90- **통계** — `sum`, `mean`, `median`, `mode`, `stdev`(표본), `pstdev`(모집단), `variance`, `min`, `max`, `count`, `range`, `prod`91- **정수** — `fact`, `comb(n,k)`, `perm(n,k)`, `gcd`, `lcm`, `isprime`92- **환산** — `conv(값, '단위', '단위')` — 식 안에서 환산이 필요할 때9394금융 함수의 이자율은 **퍼센트, 기간당** 값입니다. 연 3.62% 30년 월납이면 `pmt(원금, 3.62/12, 360)`입니다. 0.0362를 그대로 넣으면 답이 100배 어긋나니 단위를 반드시 확인하세요.9596`round`의 기본은 사사오입(half-up)입니다 — 대부분의 사람이 "반올림"이라고 할 때 기대하는 동작이고, Python 내장 `round`의 은행식과 다릅니다. 회계 규정상 은행식이 필요하면 `'half_even'`을 명시하세요.9798삼각함수와 `stdev` 계열은 내부적으로 부동소수점을 거치므로 유효숫자 약 15자리입니다. 그 이상의 정밀도가 필요한 상황이면 사용자에게 알리세요.99100## 단위 환산101102```bash103python calc.py --convert 100 km mi # 62.1371192237334... mi104python calc.py --convert 33 평 m2 --dp 2 # 109.09 m2105python calc.py --convert 1 GiB MB # 1073.741824 MB106python calc.py --convert 98.6 f c # 37 c107```108109지원 차원: 길이, 무게, 면적, 부피, 시간, 데이터, 속도, 압력, 에너지, 각도, 힘, 온도. 한국 전통 단위(평, 마지기, 돈, 근, 관, 냥, 되, 홉, 말, 자, 리)도 들어 있습니다. 전체 이름은 `--units`로 확인하세요.110111데이터 단위는 대소문자를 구분합니다: `MB`(10⁶) ≠ `MiB`(2²⁰), `Mb`(메가비트) ≠ `MB`(메가바이트). 사용자가 "메가"라고만 말했다면 어느 쪽인지 확인하거나, 가정을 명시하고 답하세요.112113차원이 다른 환산(kg → m)이나 모호한 이름은 추측하지 않고 오류를 냅니다. 오류가 나면 사용자가 실제로 무엇을 원했는지 다시 읽어보라는 신호입니다.114115## 날짜 계산116117```bash118python calc.py --date-diff 2026-07-30 2026-12-25 # 148 days (21.1429 weeks, 0.4052 years)119python calc.py --date-add 2026-07-30 100 # 2026-11-07 (Saturday)120```121122날짜 차이는 윤년을 포함해 실제 달력으로 계산합니다. `--date-add`는 요일까지 알려주므로 마감일이 주말에 걸리는지 바로 확인할 수 있습니다. `YYYY-MM-DD`, `YYYY/MM/DD`, `YYYY.MM.DD`를 모두 받습니다.123124## 실무 예제125126세금·대출·투자수익·통계·큰 수 등 구체적인 계산 레시피는 `references/recipes.md`에 있습니다. 사용자 요청이 단순 산술을 넘어 여러 단계를 밟아야 할 때 그 파일을 읽으세요.127128## 한계129130- 기호 대수(방정식 풀이, 미분, 인수분해)는 지원하지 않습니다. 필요하면 그렇게 말하고 다른 방법을 제안하세요.131- 환율, 주가, 물가지수 같은 **실시간 데이터**는 들어 있지 않습니다. 사용자가 값을 주거나 별도 조회가 필요합니다.132- 세율·상환 방식은 나라와 상품마다 다릅니다. 이 스킬은 산술을 보장하지만 규정 해석은 보장하지 않습니다 — 가정한 세율·방식을 답변에 명시하세요.