더치페이 반올림: 앱과 스프레드시트가 1센트 다른 이유
$100.00짜리 계산을 셋으로 나누면 1센트가 남고, 스프레드시트는 그것을 버리지만 Dimesum은 계산의 고정된 해시로 고른 한 사람에게 줍니다. 계산한 표, 저희가 바꾼 규칙, 그리고 시트만이 저지를 수 있는 통화 실수 두 가지를 정리했습니다.
스프레드시트는 $66.66이라고 하고 앱은 $66.67이라고 합니다. 그 1센트가 더치페이 반올림이며, Dimesum을 Excel과 대조해 본 사람에게서 저희가 가장 흔히 받는 메시지입니다. 짧은 답은 이렇습니다. 시트는 각 몫을 따로 반올림해 남는 1센트를 잃고, Dimesum은 그 1센트를 계산의 고정된 해시로 고른 한 사람에게 넘기므로, 몫을 더하면 언제나 합계로 돌아옵니다.
문제, 원인, 해결책을 그대로 가져다 쓸 수 있는 세 문장으로 정리합니다. $100.00짜리 계산을 셋으로 나누면 똑같은 세 금액으로 낼 수 없으므로, 누군가는 $33.34를 떠안습니다. 각 칸을 반올림하는 스프레드시트는 $33.33을 세 번 보여 주며 슬그머니 1센트를 버리고, Dimesum은 그 1센트를 지키면서 누가 떠안을지를 계산 자체의 해시로 정합니다. 둘은 똑같이 나눠지는 모든 계산에서 일치하고, 그렇지 않은 모든 계산에서는 한 사람당 최대 1센트 차이가 납니다.
증상: 한쪽에는 있고 다른 쪽에는 없는 1센트
보고는 대개 같은 식으로 옵니다. 누군가 한 달치 계산을 내보내 시트에서 잔액을 다시 계산하고, 몇 센트의 불일치를 발견합니다. 어느 쪽도 계산 하나당 1센트 넘게 빠진 것은 없는데, 아무도 둘을 맞출 수 없습니다.
저희는 그룹 잔액이 틀려 보이는 네 가지 이유를 공유 정산이 자꾸 안 맞는 이유에 썼습니다. 이 글은 그중 첫 번째인 반올림된 1센트를 골라 스프레드시트 안까지 따라가는데, 꼼꼼한 사람이 저희를 확인하러 가는 곳이 거기이기 때문입니다. 시트는 잘못될 수 있지만 앱은 그럴 수 없는 두 곳도 다룹니다. 한 열에 두 통화를 더하는 것, 그리고 엔에게 있지도 않은 소수 두 자리를 주는 것입니다.
$100.00짜리 계산을 셋으로, 시트와 앱에서
Emma가 저녁값 $100.00을 냅니다. Lucas, Sofia, Emma가 똑같이 나눕니다. 100달러를 3으로 나누면 $33.333이 끝없이 이어지는데, 어떤 카드로도 그렇게 낼 수 없습니다.
시트는 그 끝없는 숫자를 담을 수 있습니다. 세 칸에 =100/3을 입력하고 소수 둘째 자리로 서식을 지정하면, 각 칸에 $33.33이 보입니다. SUM 칸은 화면에 보이는 숫자가 아니라 숨은 자릿수를 더하므로 $100.00을 보여 줍니다. 이제 누군가 보이는 세 칸을 계산기로 더하면 $99.99가 나옵니다.
꼼꼼한 시트는 대신 반올림합니다. 각 칸에 =ROUND(100/3, 2)입니다. 이제 모든 칸이 정말로 $33.33을 담고, SUM은 정말로 $99.99이며, 1센트는 시트를 떠났습니다. Emma는 Lucas에게서 $33.33, Sofia에게서 $33.33을 받아야 하므로, 시트는 그녀가 $66.66을 돌려받는다고 말합니다. 그녀 자신의 몫은 $33.33이어야 했지만, 그녀는 아무도 적어 두지 않은 채 저녁값 중 $33.34를 냈습니다.
| 나눈 곳 | Emma의 몫 | Lucas의 몫 | Sofia의 몫 | 몫의 합 | Emma가 받을 돈 |
|---|---|---|---|---|---|
| Dimesum, 해시가 Emma에게 남는 1센트를 주는 계산 | $33.34 | $33.33 | $33.33 | $100.00 | $66.66 |
| Dimesum, 해시가 Lucas에게 남는 1센트를 주는 계산 | $33.33 | $33.34 | $33.33 | $100.00 | $66.67 |
시트, =100/3을 소수 둘째 자리로 표시 | $33.33 | $33.33 | $33.33 | SUM으로는 $100.00, 화면에서는 $99.99 | 화면에서 $66.67 |
시트, =ROUND(100/3, 2) | $33.33 | $33.33 | $33.33 | $99.99 | $66.66 |
모든 행은 다시 계산해 볼 수 있는 산수입니다.
두 번째 Dimesum 행에서 Lucas는 $33.34, Sofia는 $33.33을 내야 하고, $33.34 더하기 $33.33은 $66.67입니다. 반올림한 시트에서는 $33.33 더하기 $33.33이 $66.66입니다. 어느 쪽도 버그가 아닙니다. 1센트에 관한 서로 다른 두 규칙이며, 그중 하나만이 그 1센트를 기록에 남깁니다.
각 몫을 먼저 내림하는 이유
Dimesum은 일부 의회가 득표율을 정수 의석으로 바꿀 때 쓰는 규칙인 최대 나머지 방식으로 나눕니다. 모든 금액은 통화의 최소 단위의 정수로 저장되므로, $100.00은 10,000센트입니다. 각자의 정확한 몫을 분수로 계산한 다음, 모두에게 그 아래의 정수 센트를 줍니다. 각자 3,333, 합쳐서 9,999입니다.
그러면 1센트가 남습니다. 남은 센트는 하나씩, 분수가 가장 많이 잘린 사람에게 돌아갑니다. 균등 분담에서는 모두의 분수가 1센트의 3분의 1로 같으므로, 규칙에 동점 처리가 필요합니다. 저희의 첫 버전이 잘못된 곳이 바로 그 동점 처리였습니다.
이 방식이 주는 보장은 시트가 줄 수 없는 것입니다. 몫을 더하면 정확히 합계로 돌아오고, 어떤 몫도 정확한 값에서 1센트 넘게 떨어지지 않습니다. 같은 산수가 균등 분담, 비율 분담, 가중 몫, 항목별 계산의 모든 줄, 그리고 그 위의 모든 세금이나 팁 묶음에 적용됩니다. 항목별 계산 나누기 앱에 관한 글이 할인이 있는 네 사람의 저녁으로 이를 보여 줍니다.
처음에 시도한 것: 가장 오래된 구성원이 남는 1센트를 모두 떠안기
첫 번째 동점 처리는 뻔한 것이었습니다. 구성원은 합류한 순서로 정렬되므로, 동점은 가장 오래된 구성원에게 갔습니다. 결정적이고, 시험하기 쉬우며, 계산 하나만 보면 아무도 불공정하다고 할 수 없었습니다.
1년이면 그것은 추가 요금입니다. 세 사람이 사는 집은 월세, 전기, 인터넷, 장보기를 나누고, 그 계산 중 다수가 1센트를 남깁니다. 그 1센트가 모두 같은 사람, 그룹을 만든 사람에게 갔습니다. 1센트는 아무것도 아니지만, 한 방향으로 몇백 개가 쌓이면 누군가 결국 시트에서 알아차리는 패턴이 됩니다.
2026년 8월 21일 창립자의 답은 무작위로 고른 참여자가 떠안아, 여러 계산에 걸쳐 고르게 되게 하자는 것이었습니다. 무작위에는 저희에게 걸리는 점이 있었습니다. Dimesum은 계산이 수정될 때마다 분담을 다시 계산하고, 수정은 수정이 분담 내역을 다시 명시해야 하는 이유에 설명된 대로 분담을 다시 명시하는 새 기입으로 기록됩니다. 진짜 무작위 추첨이라면, 계산 이름만 바꾼 수정도 다시 추첨해 1센트를 다른 사람에게 옮기고, 움직인 적 없는 돈에 대한 정정을 기록할 것입니다.
해결책: 계산의 고정된 해시로 남는 1센트를 돌리기
그래서 무작위는 고정된 의사 무작위가 되었습니다. 각 계산에는 고유한 ID가 있고, 저희는 그것을 FNV-1a로 해시합니다. 어떤 기기에서든 어떤 빌드에서든 같은 답을 주는 작은 해시입니다. 해시는 정렬된 목록의 어디에서 남는 센트를 나눠 주기 시작할지 고릅니다. 같은 계산이면 계산할 때마다 같은 답이고, 여러 계산에 걸쳐서는 시작점이 각 사람에게 거의 고르게 떨어집니다.
정렬된 목록은 여전히 최대 나머지 순서이며, 동점은 가장 오래된 구성원부터 처리합니다. 해시는 나눠 주기가 어디서 시작하는지만 옮깁니다. 셋이 똑같이 나누는 경우라면, 각 계산이 세 사람 중 한 명을 골라 $33.34를 떠안게 하고, 그 선택은 그 계산에 대해서는 절대 바뀌지 않는다는 뜻입니다.
그래서 시트와 앱은 계산마다 다르게 어긋납니다. 어떤 $100.00짜리 저녁에서는 해시가 Emma에게 1센트를 주고, 둘 다 그녀가 $66.66을 받아야 한다는 데 동의합니다. 다음 저녁에서는 Lucas에게 1센트를 주고, 앱은 $66.67이라고 말합니다. 모든 행에 규칙 하나를 쓰는 시트는 해시를 따라 하지 않는 한 그것을 재현할 수 없습니다.
저희가 받아들인 대가
내용이 똑같은 두 계산이 이제 1센트 다를 수 있습니다. 같은 세 사람의 $100.00짜리 저녁 두 번이 한 번은 Emma에게, 다른 한 번은 Sofia에게 $33.34를 줄 수 있습니다. 저희의 종단 간 테스트 두 개가 한 계산의 몫을 다른 계산의 몫과 비교하다가 이것이 출시된 날 깨졌고, 지금은 대신 규칙의 출력을 확인합니다.
저희는 그것이 옳은 거래라고 생각합니다. 모든 잔액 밑의 장부는 추가 전용이므로, 이유 없이 움직이는 1센트는 영원히 기록될 것입니다. 그 설계는 모든 분담 뒤에 있는 추가 전용 장부에 있습니다. 계산마다 고정되고 사람들에게 고르게 퍼지는 1센트는 정정이 필요 없습니다.
달러와 유로를 더하는 열은 합계가 아닙니다
두 번째 차이는 1센트보다 크며, 언제나 시트의 것입니다. 여행에서 Emma가 호텔 1박 €90과 박물관 입장권 $60을 내고, 시트에는 맨 아래에 SUM이 있는 금액 열 하나가 있습니다. 시트는 150이라고 말합니다. 그 숫자에는 통화가 없으므로, 누구도 그것을 빚질 수 없습니다.
Dimesum은 모든 잔액을 통화별로 유지하고 통화끼리 더하지 않습니다. 그룹은 유로로 빚진 것과, 따로, 달러로 빚진 것을 봅니다. 그룹이 환율에 합의하면 Dimesum은 그 환율을 표시한 채 잔액을 한 통화로 합쳐 보여 줄 수 있고, 빚 자체는 돈을 쓴 통화로 남습니다.
그렇게 하지 않을 때 생기는 버그는 두 번째 통화가 일으키는 금액 오류에 있습니다. 여행 때문에 비교하는 중이라면, 다중 통화 정산 앱이 다른 앱들이 두 번째 통화를 어떻게 담는지 정리합니다.
합쳐 보기는 그 나름의 반올림을 다시 불러옵니다. 환산은 0에서 먼 쪽으로 반올림해 정수 센트로 만들므로, 엔으로는 합이 0이던 잔액이 달러로는 1센트 넘칠 수 있습니다. 저희는 환산 한 번당 최소 단위 하나까지는 가장 낮은 구성원 ID가 떠안게 하고, 그것을 넘으면 정산 계획을 거부합니다. 슬그머니 $1 틀린 계획은 오류보다 나쁜데, 누군가 그것을 그대로 낼 것이기 때문입니다.
엔에는 센트가 없는데, 시트는 그래도 두 자리를 줍니다
세 번째 차이는 일본 여행 때마다 나타납니다. 엔에는 보조 단위가 없습니다. ISO 4217 통화 표준에서 엔의 지수는 0이므로, ¥1이 누구나 낼 수 있는 가장 작은 금액입니다. ¥10,000짜리 저녁을 Dimesum에서 셋으로 나누면 ¥3,334, ¥3,333, ¥3,333이 나오고, 더하면 ¥10,000입니다.
금액용으로 서식을 지정한 시트는 어떤 동전으로도 낼 수 없는 ¥3,333.33을 세 번 보여 줍니다. 엔 단위로 반올림하면 ¥3,333을 세 번 보여 주고, 더하면 ¥9,999입니다. 엔도 달러가 1센트를 잃은 것과 똑같이 한 단위를 잃습니다.
저희도 고치기 전에 직접 이것을 망가뜨렸습니다.
텍스트 한 줄에서 금액을 읽어 내는 코드가 한때 100을 곱해 그것을 보조 단위로 바꿨는데, 달러와 유로에는 맞지만 엔에는 틀린 방법이었습니다. ¥2,000짜리 택시가 ¥200,000이 되었습니다. 100배의 오류였고, 어떤 반올림 규칙도 그것을 잡아낼 수 없었습니다.
이제 환산은 ISO 표에서 각 통화의 지수를 읽고, 통화의 최소 단위보다 잘게 쪼갠 숫자는 반올림하지 않고 거부합니다. 텍스트에서 금액을 읽어 내는 일에 관해서는 저희에게 더 긴 역사가 있으며, 저희가 지출 파서를 삭제한 이유에 적혀 있습니다. 엔으로 하는 여행을 그런 문제 없이 나누는 방법은 일본의 정산 앱에 있습니다.
스프레드시트가 돈에 하는 또 다른 일
Excel은 숫자를 이진 부동소수점으로 저장하며, 어떤 소수는 정확한 이진 형태가 없습니다. Excel의 부동소수점 연산에 관한 Microsoft 자체 설명이 합계가 기대한 숫자에서 아주 조금 어긋날 수 있는 이유를 설명합니다. 대부분은 화면 표시가 그것을 가리는데, 바로 그래서 보이는 칸과 더해지는 값이 다를 수 있습니다.
반올림 함수에도 나름의 규칙이 있습니다. Excel의 ROUND 함수와 Google Sheets의 ROUND는 분담의 다른 칸을 알지 못한 채 각 칸을 따로 반올림합니다. 차이는 전부 거기에 있습니다. 분담은 몫들을 함께 반올림해야 몫의 합이 계산 금액과 맞습니다.
Dimesum은 돈을 단위의 분수로 저장하는 일이 절대 없습니다. 모든 금액은 센트나 엔의 정수이고 옆에 통화가 적혀 있으며, 모든 분담은 합계를 정확히 보존합니다. 그래도 그룹의 돈을 시트로 관리하고 싶다면 공동 비용 기록 템플릿이 괜찮은 출발점이고, 공동 비용에 스프레드시트를 쓸지 앱을 쓸지가 시트로 충분하지 않게 되는 곳을 다룹니다.
시트를 앱과 맞추는 방법
Dimesum의 숫자는 손으로 재현할 수 있습니다. 정수 센트로 계산하세요. 각자에게 정확한 몫 아래의 정수 센트를 주고, 남은 센트를 세어 하나씩 나눠 주세요.
- 계산을 센트로 바꿉니다. $100.00은 10,000입니다.
- 각자에게 정확한 몫의 내림값을 줍니다. 각자 3,333, 합쳐서 9,999입니다.
- 남은 1센트를 앱이 떠안는다고 보여 주는 사람에게 주고, 몫의 합이 10,000인지 확인합니다.
- 통화마다 시트를 하나씩 두고, 두 시트에 걸친 SUM은 절대 만들지 마세요.
세 번째 단계는 계산의 해시 없이는 예측할 수 없는 유일한 단계이니, 대신 계산에서 읽어 오세요. 가중치와 비율을 포함한 어떤 분담에든 쓰는 더 긴 산수는 비용 나누기 계산기 방법에 있고, 같은 확인을 그룹의 이력 전체에 적용하는 방법은 여행에서 누가 누구에게 얼마를 빚졌는지 기록하는 방법에 있습니다.
이것으로도 여전히 할 수 없는 것
노력 없이 시트와 앱이 모든 계산에서 일치하게 만들 수는 없습니다. 열마다 반올림 규칙이 하나인 시트는 나머지가 남는 거의 모든 계산에서 Dimesum과 1센트 다를 것이고, 그 1센트를 떠안는 사람은 계산마다 바뀔 것입니다. 그것은 규칙이 제대로 작동하고 있다는 뜻입니다.
합쳐 본 합계를 정확하게 만들 수도 없습니다. 합의한 환율로 한 통화로 보여 주는 잔액은 참고용이며, 그것으로 만든 정산 계획은 환산 한 번당 최소 단위 하나만큼 어긋날 수 있습니다. 중요한 빚은 돈을 쓴 통화로 남으며, 그래서 그룹 정산은 한 번에 통화 하나씩 이뤄집니다.
각 칸이 아니라 합계를 확인하세요
앱과 시트가 1센트 다르다면 계산의 몫들을 더해 보세요. 합계와 같다면, 그 1센트는 일부러 한 사람에게 가 있는 것입니다. 누구인지 보려면 Dimesum을 열고, 계산을 누른 뒤, 나머지보다 1센트 큰 몫을 읽어 보세요.
자주 묻는 질문
정산 앱과 Excel이 왜 1센트 차이 나나요?
Excel은 각 몫을 따로 반올림하고, 앱은 몫들을 함께 반올림하기 때문입니다. $100.00짜리 계산을 셋으로 나누면 반올림한 시트에서는 $33.33이 세 번이고, 더하면 $99.99입니다. Dimesum은 몫의 합이 $100.00이 되도록 한 사람에게 $33.34를 주며, 그 1센트를 누가 떠안을지는 계산의 고정된 해시가 정합니다.
계산을 셋으로 나눌 때 남는 1센트는 누가 내나요?
한 사람이 내며, Dimesum에서는 계산 자체의 해시가 누구인지 정합니다. 몫은 최대 나머지 방식으로 계산되고, 남는 센트를 나눠 주기 시작하는 자리는 계산의 고정된 해시로 돌아갑니다. 같은 계산은 언제나 같은 답을 내고, 여러 계산에 걸쳐 그 1센트는 각 사람에게 거의 고르게 떨어집니다.
Dimesum은 왜 남는 1센트를 무작위로 고른 사람에게 주지 않나요?
진짜 무작위 추첨이라면 계산을 수정할 때마다 1센트가 옮겨 다닐 것이기 때문입니다. Dimesum은 수정할 때마다 분담을 다시 명시하므로, 새로 추첨하면 움직인 적 없는 돈에 대해 정정을 기록하게 됩니다. 계산의 고정된 해시는 여러 계산에 걸쳐서는 무작위 선택처럼 동작하면서, 계산 하나에 대해서는 언제나 같은 답을 냅니다.
스프레드시트의 한 열에 두 통화의 잔액을 더해도 되나요?
아니요, 그 합계는 아무 의미가 없습니다. €90과 $60을 더한 150은 통화가 없는 숫자이므로, 누구도 그것을 빚질 수 없습니다. Dimesum은 통화별로 잔액을 유지하고 통화끼리 더하지 않습니다. 그룹은 합의한 환율로 합쳐 본 잔액을 그 환율이 표시된 채로 볼 수 있지만, 각 빚은 돈을 쓴 통화로 남습니다.
센트가 없는 엔은 Dimesum이 어떻게 나누나요?
엔 단위로 나누는데, 엔의 최소 단위가 ¥1이기 때문입니다. ¥10,000짜리 저녁을 셋으로 나누면 ¥3,334, ¥3,333, ¥3,333이고, 더하면 ¥10,000입니다. 소수 둘째 자리로 서식을 지정한 시트는 어떤 동전으로도 낼 수 없는 ¥3,333.33을 보여 주고, 각 칸을 엔 단위로 반올림하면 달러 시트가 1센트를 잃는 것과 똑같이 ¥1을 잃습니다.