# Calculator

> 숫자 계산을 암산 대신 Python으로 정확하게 실행합니다. 사칙연산, 큰 수 곱셈, 퍼센트/증감률/부가세, 단위 환산(길이·무게·면적·부피·평·돈·온도·데이터), 날짜 차이, 대출 상환금·복리·CAGR, 평균·중앙값·표준편차, 팩토리얼·조합·최소공배수를 다룹니다. 사용자 요청에 숫자와 연산이 함께 등장하면 - "얼마야", "몇 퍼센트", "총합", "몇 배", "환산", "며칠", "월 상환금", "평균" 같은 표현을 포함해 - 계산기라고 명시하지 않아도 반드시 이 스킬을 사용하세요. 표·견적·재무 모델의 숫자를 검산할 때도 사용하세요. 코드베이스에 계산 로직을 구현하는 작업(함수 작성, 버그 수정)에는 사용하지 마세요.

- Skill: `0seobee-seon/calculator` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add 0seobee-seon/calculator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/0seobee-seon/calculator/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: 0seobee-seon (https://skillmd.com/u/0seobee-seon)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/0seobee-seon/calculator

---


# Calculator

## 왜 이 스킬이 필요한가

언어 모델은 긴 곱셈, 연쇄 퍼센트, 단위 환산에서 **조용히** 틀립니다. 틀린 답이 그럴듯하게 보이기 때문에 사용자가 잡아내기 어렵습니다. 그래서 이 스킬의 규칙은 하나입니다: **숫자는 머리로 계산하지 말고 코드로 계산한다.**

계산 엔진은 이 스킬 기준 디렉토리의 `scripts/calc.py`입니다 (스킬 로드 시 안내되는 절대 경로 사용). 표준 라이브러리만 쓰므로 설치할 것이 없습니다.

```bash
python "<skill-dir>/scripts/calc.py" "1234 * 5678"
```

`python`이 없으면 `python3`로 시도하세요. 처음 쓸 때 동작이 의심되면 `--selftest`로 33개 검증을 돌려볼 수 있습니다.

## 작업 흐름

1. **식으로 옮긴다.** 사용자의 말을 하나의 식으로 번역합니다. 중간값을 손으로 계산해 다음 단계에 넣지 마세요 — 한 줄에 이어 붙이거나 `-v`로 변수를 넘기면 반올림 오차가 끼어들 여지가 없습니다.
2. **실행한다.** 여러 값이 필요하면 `-`(stdin) 배치 모드로 한 번에 처리합니다.
3. **자릿수를 확인한다.** 결과의 크기가 상식과 맞는지 봅니다. 어긋나면 단위나 퍼센트 해석을 잘못한 것이지 산술 실수가 아닙니다 — 식을 다시 읽으세요.
4. **식과 함께 답한다.** 사용자가 검증할 수 있도록 사용한 식을 보여주고, 반올림했다면 어디서 했는지 밝히세요. 큰 수를 문장에 인용할 때는 `--comma`로 자리수를 끊어 받아 그대로 옮겨 적으세요 — 자릿수를 눈으로 세다가 틀리는 걸 막아줍니다.

정확한 값과 반올림한 값이 다를 때는 둘 다 제시하는 편이 안전합니다. 예: "정확히는 1,085,342.7원, 원 단위로 끊으면 1,085,343원."

## 기본 사용법

```bash
# 단일 식
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자리입니다. 그 이상의 정밀도가 필요한 상황이면 사용자에게 알리세요.

## 단위 환산

```bash
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)이나 모호한 이름은 추측하지 않고 오류를 냅니다. 오류가 나면 사용자가 실제로 무엇을 원했는지 다시 읽어보라는 신호입니다.

## 날짜 계산

```bash
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`에 있습니다. 사용자 요청이 단순 산술을 넘어 여러 단계를 밟아야 할 때 그 파일을 읽으세요.

## 한계

- 기호 대수(방정식 풀이, 미분, 인수분해)는 지원하지 않습니다. 필요하면 그렇게 말하고 다른 방법을 제안하세요.
- 환율, 주가, 물가지수 같은 **실시간 데이터**는 들어 있지 않습니다. 사용자가 값을 주거나 별도 조회가 필요합니다.
- 세율·상환 방식은 나라와 상품마다 다릅니다. 이 스킬은 산술을 보장하지만 규정 해석은 보장하지 않습니다 — 가정한 세율·방식을 답변에 명시하세요.

