LabHub
배우기 러닝패스 코스

은행 현장의 언어 · 금액을 실수로 다루면 생기는 오차 · 실습

합계가 3원 안 맞는데 어느 줄도 틀리지 않았다

LabHub 에서 이어서 보기

목표

통화마다 다른 최소단위를 표로 만들고, 수수료 원장을 정수 최소단위로 다시 적재하고, 반올림 모드를 정책으로 못박고, 나머지 1까지 맞는 배분과 환산 순서에 따른 차이를 산출물로 남긴다.

왜 중요한가

금액을 실수로 다루면 한 줄에 1씩 어긋나고, 그 정도는 단위 시험이 잡지 못한다. 합계가 안 맞는다는 문의가 들어와도 어느 줄이 틀렸는지 짚을 수 없어서 "다시 돌리면 맞는다" 는 운영 절차가 생긴다.
여기서 정하는 것은 세 가지다. 저장 형식(정수 최소단위), 끊는 자리와 반올림 모드(정책), 나머지 배분 규칙(최대잉여법). 셋 다 기술이 정해 주지 않고 사람이 정해 문서에 적어야 하는 것이다.
채점기는 여러분이 적은 숫자끼리 비교하지 않는다. 1단계에서 만든 원자료에서 기준값을 다시 계산해 대조한다. 그래서 규칙을 그대로 따르는 것이 중요하다.

단계

1. /root/money/gen_money.py 를 만들어 실행해 /root/money/currencies.json, /root/money/fees.csv(600행), /root/money/splits.csv(30건)를 만든다.
2. 가산율 0.125 를 실수 경로와 정수 경로로 각각 계산해 /root/money/float_gap.json 에 어긋난 줄 수와 차이를 적는다.
3. /root/money/money.db 에 fee(정수 최소단위)와 fee_real(REAL) 두 표로 적재하고 /root/money/store.json 에 통화별 두 합계를 적는다.
4. /root/money/money_fmt.py 에 파싱과 표시를 모으고, 안내의 입력 12개를 판정해 /root/money/format_check.json 을 만든다.
5. 같은 곱셈을 ROUND_HALF_UP 과 ROUND_HALF_EVEN 으로 끊어 /root/money/rounding.json 에 갈라진 줄 수와 두 합계를 적는다.
6. splits.csv 의 30건을 최대잉여법으로 배분해 /root/money/alloc.json 에 적는다. 합계는 총액과 정확히 같아야 한다.
7. 안내의 환율표로 통화 5종을 원화로 환산해 /root/money/fx.json 에 줄 단위와 총액 단위 두 값을 적는다.
8. 앞 단계의 결과를 /root/money/report.json 하나로 묶고 fees.csv 의 sha256 을 함께 적는다.

참고

단계 8개

  1. 통화표와 수수료 원장 만들기
  2. 실수로 계산한 가산금이 몇 줄이나 어긋나는가
  3. 정수 최소단위로 다시 적재하기
  4. 파싱과 표시를 한 문으로 모으기
  5. 반올림 모드를 정책으로 못박기
  6. 나머지 1까지 맞는 배분
  7. 환산 순서가 결과를 바꾼다
  8. 여섯 단계를 보고서 하나로 묶기