빠진 1원
당신이 줄을 더하고, 상대 회계가 줄을 더하는데, 두 합계가 1원 다릅니다. 아무도 계산을 틀리지 않았습니다. 원인은 둘 — 반올림하는 시점이 다른 것과, 컴퓨터가 소수를 저장하는 방식 — 이고 둘 다 피할 수 있습니다.
돈은 소수가 아니라 정수
컴퓨터는 0.1과 0.2를 아주 가깝지만 정확하지는 않은 이진 소수로 저장합니다. 그래서 대부분의 언어에서 0.1 더하기 0.2는 0.3이 아닙니다. 한 줄에서는 아무도 눈치채지 못합니다. 마흔 줄과 세액 계산을 지나면 오차가 쌓여 눈에 보이는 1원이 됩니다. 앱은 금액을 소수로 들고 있지 않습니다. 모든 가격은 입력되는 순간 **정수**가 되고, 계산은 전부 정수로 이루어지며, 표시할 때만 되돌립니다.
한 곳에서 한 번만 반올림
두 번째 원인은 더 미묘합니다. 소수 단위가 있는 통화로 보면 분명합니다. 단가 0.335유로짜리 3개를 세 줄 잡으세요. 각 줄을 먼저 반올림하면 1.01이 세 번, 합 3.03. 먼저 더하고 한 번 반올림하면 3.02. 산술적으로 둘 다 틀리지 않고 서로 다른 질문의 답입니다. 틀린 것은 한 문서에서 둘을 다 하는 것 — 보여 줄 때는 줄을 반올림하고 합계는 반올림하지 않은 값으로 내는 것 — 입니다. 그러면 보이는 줄이 보이는 합계가 되지 않는 청구서가 나옵니다. 앱은 줄마다 한 번 반올림하고 반올림한 줄을 더합니다.
할인이 1원을 숨기는 곳
합계에 대한 퍼센트 할인은 줄에 고르게 나뉘지 않습니다. 3.33유로짜리 세 줄에 10퍼센트면 0.999유로 — 줄마다 3분의 1센트이고, 인쇄할 수 없는 값입니다. 각 줄의 몫을 내림하면 합계에서 부족해지고, 올림하면 남습니다. 앱은 할인을 소계에 대해 계산하고 줄에 배분한 뒤 나머지를 한 줄에 얹어, 할인된 줄의 합이 할인된 소계와 정확히 같게 만듭니다.
보조 단위가 없는 통화
모든 통화가 소수 두 자리를 갖지는 않습니다. 일본 엔은 아예 없습니다. 금액은 정수 엔이고 반올림할 하위 단위가 없습니다. 두 자리를 못 박은 시스템은 ¥1,250.00 같은 가격을 만드는데, 엔을 그렇게 쓰지 않을뿐더러 존재하지 않는 단위의 100분의 1로 반올림합니다. 앱은 소수 자릿수를 **통화마다** 보관합니다.
자주 묻는 질문
청구서가 스프레드시트와 1원 다른 이유는?
보통 한쪽은 줄마다, 다른 쪽은 합계만 반올림하기 때문입니다. 둘 다 말이 되지만 한 문서에서 섞으면 안 됩니다.
줄별로 반올림할까요 합계에서 할까요?
줄별로 하고 반올림한 줄을 더하세요. 그래야 인쇄된 줄이 인쇄된 합계가 됩니다.
0.1 + 0.2가 정말 0.3이 아닌가요?
이진 부동소수점에서는 0.30000000000000004입니다. 그래서 돈은 정수로 다룹니다.
퍼센트 할인이 왜 나머지를 남기나요?
합계의 몇 퍼센트가 줄에 딱 떨어지는 일은 드물기 때문입니다. 나머지는 한 줄에 얹혀야 합니다.
앱은 일본 엔을 어떻게 다루나요?
소수 자릿수 0인 통화로. 정수 엔이고 보조 단위도 소수 반올림도 없습니다.
합계를 손으로 고치면 안 되나요?
안 됩니다. 줄의 합과 다른 합계는 검토자가 가장 먼저 알아채는 지점입니다. 반올림 규칙을 고치세요.
합계가 진짜로 맞아떨어지는 청구서. Invoice Maker는 청구서·프로포마·견적서·영수증을 브라우저에서 만들고, 금액을 정수 단위로 계산해 세액 줄이 밀리지 않게 하며 PDF로 내보냅니다. 아무것도 업로드되지 않습니다.
브라우저에서 청구서 만들기