Strona główna / Blog / Inżynieria
InżynieriaZaokrąglanie przy dzieleniu rachunku: skąd różnica o cent
Rachunek na 100,00 USD podzielony na trzy zostawia jeden cent, który arkusz gubi, a Dimesum daje jednej osobie, wybranej przez stały hash rachunku. Oto przeliczona tabela, reguła, którą zastąpiliśmy, i dwa błędy walutowe, które może popełnić tylko arkusz.
Twój arkusz pokazuje 66,66 USD, a aplikacja 66,67 USD. Ten jeden cent to zaokrąglanie przy dzieleniu rachunku i to najczęstsza wiadomość, jaką dostajemy od kogoś, kto porównał Dimesum z Excelem. Krótka odpowiedź: arkusz zaokrągla każdy udział osobno i gubi pozostały cent, a Dimesum przekazuje ten cent jednej osobie, wybranej przez stały hash rachunku, więc udziały zawsze sumują się z powrotem do kwoty całkowitej.
Problem, przyczyna i rozwiązanie w trzech zdaniach, które możesz zacytować. Rachunku na 100,00 USD podzielonego na trzy nie da się zapłacić w trzech równych kwotach, więc ktoś ponosi 33,34 USD. Arkusz, który zaokrągla każdą komórkę, pokazuje trzy razy 33,33 USD i po cichu gubi cent, a Dimesum zachowuje ten cent i decyduje, kto go poniesie, na podstawie hasha samego rachunku. Oba będą zgodne przy każdym rachunku, który dzieli się równo, i będą się różnić o najwyżej jeden cent na osobę przy każdym, który się nie dzieli.
Objaw: cent, który jedna strona ma, a druga nie
Zgłoszenie zwykle przychodzi w ten sam sposób. Ktoś eksportuje miesiąc rachunków, odtwarza salda w arkuszu i znajduje kilka centów rozbieżności. Po żadnej stronie nie brakuje więcej niż centa na rachunek, a mimo to nikt nie potrafi doprowadzić obu do zgodności.
O czterech powodach, dla których saldo grupy wygląda na błędne, pisaliśmy w tekście dlaczego wspólne salda nigdy się nie zgadzają. Ten tekst bierze pierwszy z nich, zaokrąglony cent, i śledzi go w arkuszu, bo tam idzie skrupulatna osoba, żeby nas sprawdzić. Omawia też dwa miejsca, w których arkusz się myli, a aplikacja nie może: dodawanie dwóch walut w jednej kolumnie i nadawanie jenowi dwóch miejsc po przecinku, których nie ma.
Rachunek na 100,00 USD, na trzy, w arkuszu i w aplikacji
Emma płaci 100,00 USD za kolację. Lucas, Sofia i Emma dzielą ją po równo. Sto dolarów podzielone przez trzy to 33,333 USD i tak dalej w nieskończoność, czego żadna karta nie zapłaci.
Arkusz może przechowywać tę nieskończoną liczbę. Wpisz =100/3 w trzy komórki, sformatuj je do dwóch miejsc po przecinku, a każda pokaże 33,33 USD. Komórka SUMA pokazuje 100,00 USD, bo dodaje ukryte cyfry, a nie te na ekranie. Teraz czytelnik dodaje trzy widoczne komórki na kalkulatorze i dostaje 99,99 USD.
Skrupulatny arkusz zamiast tego zaokrągla: =ROUND(100/3, 2) w każdej komórce. Teraz każda komórka naprawdę zawiera 33,33 USD, SUMA naprawdę wynosi 99,99 USD, a cent opuścił arkusz. Lucas jest winien Emmie 33,33 USD i Sofia 33,33 USD, więc arkusz mówi, że Emma dostaje z powrotem 66,66 USD. Jej własny udział miał wynosić 33,33 USD, ale zapłaciła 33,34 USD za kolację, a nikt tego nie zapisał.
| Gdzie ją podzielono | Udział Emmy | Udział Lucasa | Udział Sofii | Suma udziałów | Emmie należy się |
|---|---|---|---|---|---|
| Dimesum, rachunek, którego hash daje Emmie nieparzysty cent | 33,34 USD | 33,33 USD | 33,33 USD | 100,00 USD | 66,66 USD |
| Dimesum, rachunek, którego hash daje Lucasowi nieparzysty cent | 33,33 USD | 33,34 USD | 33,33 USD | 100,00 USD | 66,67 USD |
Arkusz, =100/3 pokazane z dwoma miejscami | 33,33 USD | 33,33 USD | 33,33 USD | 100,00 USD w SUMIE, 99,99 USD na ekranie | 66,67 USD na ekranie |
Arkusz, =ROUND(100/3, 2) | 33,33 USD | 33,33 USD | 33,33 USD | 99,99 USD | 66,66 USD |
Każdy wiersz to arytmetyka, którą możesz powtórzyć.
W drugim wierszu Dimesum Lucas jest winien 33,34 USD, a Sofia 33,33 USD, a 33,34 USD plus 33,33 USD to 66,67 USD. W zaokrąglonym arkuszu 33,33 USD plus 33,33 USD to 66,66 USD. Żadne z nich nie jest błędem. To dwie różne reguły dotyczące jednego centa i tylko jedna z nich zachowuje ten cent w zapisie.
Dlaczego każdy udział najpierw zaokrągla się w dół
Dimesum dzieli metodą największych reszt, regułą, której niektóre parlamenty używają, by zamienić udziały głosów na całe mandaty. Każda kwota jest przechowywana jako liczba całkowita najmniejszych jednostek waluty, więc 100,00 USD to 10 000 centów. Dokładny udział każdej osoby wylicza się jako ułamek, a potem każdy dostaje całe centy poniżej niego: po 3333, czyli razem 9999.
Zostaje jeden cent. Pozostałe centy rozdaje się po jednym, osobom, których ułamki zostały najbardziej przycięte. Przy podziale po równo ułamek każdego jest taki sam, jedna trzecia centa, więc reguła potrzebuje rozstrzygnięcia remisu. I właśnie w tym rozstrzygnięciu nasza pierwsza wersja się pomyliła.
Gwarancja, którą daje ta metoda, to ta, której arkusz dać nie może: udziały sumują się dokładnie z powrotem do kwoty całkowitej i żaden udział nie odbiega o więcej niż jeden cent od swojej dokładnej wartości. Ta sama arytmetyka działa przy podziale po równo, podziale procentowym, udziałach ważonych, każdej pozycji rachunku rozbitego na pozycje i każdej puli podatku lub napiwku na nim. Nasz tekst o aplikacjach do dzielenia rachunku według pozycji pokazuje to na kolacji dla czterech osób z rabatem.
Co próbowaliśmy najpierw: najstarszy członek brał każdy nieparzysty cent
Pierwsze rozstrzygnięcie remisu było oczywiste. Członkowie są uporządkowani według tego, kiedy dołączyli, więc remisy trafiały do najstarszego członka. To jest deterministyczne, łatwe do przetestowania i przy żadnym pojedynczym rachunku nikt nie mógłby nazwać tego niesprawiedliwym.
W skali roku to dopłata. Mieszkanie z trzema osobami dzieli czynsz, prąd, internet i zakupy, a wiele z tych rachunków zostawia cent. Każdy z tych centów trafiał do tej samej osoby, tej, która założyła grupę. Cent to nic; kilkaset centów w jedną stronę to wzorzec, który ktoś w końcu zauważy w arkuszu.
Odpowiedź założyciela z 21 sierpnia 2026 brzmiała, że powinien go ponosić losowy uczestnik, tak aby wyrównało się to w wielu rachunkach. Losowość miała dla nas haczyk. Dimesum przelicza podział rachunku przy każdej edycji, a edycja jest zapisywana jako nowy wpis, który na nowo przedstawia podział, jak opisano w tekście o tym, dlaczego edycja musi na nowo przedstawić swój podział. Przy prawdziwym losowaniu edycja, która zmieniła tylko nazwę rachunku, losowałaby ponownie, przenosiła cent na kogoś innego i księgowała korektę dla pieniędzy, które nigdy się nie ruszyły.
Rozwiązanie: rotacja nieparzystego centa według stałego hasha rachunku
Losowość stała się więc pseudolosowa i stała. Każdy rachunek ma własny identyfikator, który haszujemy algorytmem FNV-1a, małą funkcją skrótu, która daje tę samą odpowiedź na każdej maszynie i w każdej wersji. Hash wybiera, w którym miejscu uporządkowanej listy zaczyna się rozdawanie pozostałych centów. Ten sam rachunek, ta sama odpowiedź, za każdym razem, gdy jest liczony; w wielu rachunkach punkt startowy trafia na każdą osobę mniej więcej równo.
Uporządkowana lista to nadal kolejność największych reszt, z remisami rozstrzyganymi na korzyść najstarszego członka. Hash przesuwa tylko miejsce, od którego zaczyna się rozdawanie. Przy równym podziale na trzy oznacza to, że każdy rachunek wybiera jedną z trzech osób, która poniesie 33,34 USD, a ten wybór nigdy się dla tego rachunku nie zmienia.
Dlatego twój arkusz i aplikacja różnią się inaczej przy różnych rachunkach. Przy jednej kolacji za 100,00 USD hash daje cent Emmie i oba są zgodne, że należy jej się 66,66 USD. Przy następnej daje cent Lucasowi i aplikacja mówi 66,67 USD. Arkusz z jedną regułą dla każdego wiersza nie może tego odtworzyć, chyba że skopiuje hash.
Koszt, który zaakceptowaliśmy
Dwa rachunki o identycznej treści mogą się teraz różnić o jeden cent. Dwie kolacje za 100,00 USD z tymi samymi trzema osobami mogą podzielić się jako 33,34 USD dla Emmy przy jednej i 33,34 USD dla Sofii przy drugiej. Dwa z naszych własnych testów end to end porównywały udziały jednego rachunku z udziałami innego i przestały przechodzić w dniu, w którym to wdrożyliśmy; teraz sprawdzają wynik reguły.
Uważamy, że to właściwy kompromis. Księga pod każdym saldem jest tylko do dopisywania, więc cent, który przesuwa się bez powodu, zostałby zapisany na zawsze; projekt opisujemy w tekście o księdze tylko do dopisywania, na której opiera się każdy podział. Cent, który jest stały dla każdego rachunku i rozłożony między osoby, nigdy nie wymaga korekty.
Kolumna, która dodaje dolary do euro, nie jest sumą
Druga różnica jest większa niż cent i zawsze leży po stronie arkusza. Na wyjeździe Emma płaci 90 € za noc w hotelu i 60 USD za bilet do muzeum, a arkusz ma jedną kolumnę Kwota z SUMĄ na dole. Pokazuje 150. Ta liczba nie ma waluty, więc nikt nie może jej być winien.
Dimesum prowadzi każde saldo w podziale na waluty i nigdy nie dodaje między nimi. Grupa widzi, ile jest winna w euro, i osobno, ile jest winna w dolarach. Jeśli grupa uzgodni kurs, Dimesum może pokazać salda połączone w jedną walutę, opisane tym kursem, a sam dług pozostaje w walucie, w której go wydano.
Błędy, które biorą się z innego podejścia, opisujemy w tekście o błędach finansowych, które powoduje druga waluta. Jeśli porównujesz z powodu wyjazdu, zestawienie aplikacji do dzielenia wydatków w wielu walutach pokazuje, jak inne aplikacje obsługują drugą walutę.
Łączenie przywraca własne zaokrąglanie. Przeliczenie zaokrągla do pełnych centów, połówki od zera, więc salda, które w jenach sumowały się do zera, w dolarach mogą dać jeden cent nadwyżki. Pozwalamy członkowi o najniższym identyfikatorze wchłonąć do jednej najmniejszej jednostki na przeliczenie, a powyżej tego plan rozliczenia jest odrzucany. Plan, który po cichu myli się o 1 USD, jest gorszy niż błąd, bo ktoś by go zapłacił.
Jen nie ma groszy, a arkusz i tak daje mu dwa miejsca po przecinku
Trzecia różnica pojawia się przy każdym wyjeździe do Japonii. Jen nie ma jednostki pomocniczej: jego wykładnik w standardzie walut ISO 4217 wynosi zero, więc 1 ¥ to najmniejsza kwota, jaką ktokolwiek może zapłacić. Kolacja za 10 000 ¥ podzielona na trzy w Dimesum daje 3334 ¥, 3333 ¥ i 3333 ¥, co sumuje się do 10 000 ¥.
Arkusz sformatowany jako waluta pokazuje trzy razy 3333,33 ¥, kwotę, której nie zapłaci żadna moneta. Zaokrąglij ją do pełnych jenów, a pokaże trzy razy 3333 ¥, co sumuje się do 9999 ¥. Jen traci jedną jednostkę tak samo, jak dolar stracił cent.
Sami to zepsuliśmy, zanim to naprawiliśmy.
Kod, który odczytuje kwotę z linijki tekstu, kiedyś zamieniał ją na jednostki pomocnicze, mnożąc przez 100, co jest poprawne dla dolarów i euro, a błędne dla jenów: taksówka za 2000 ¥ stała się taksówką za 200 000 ¥. To był błąd o czynnik 100 i żadna reguła zaokrąglania nie mogłaby go wyłapać.
Przeliczenie odczytuje teraz wykładnik każdej waluty z tabeli ISO, a kwota dokładniejsza niż najmniejsza jednostka waluty jest odrzucana, a nie zaokrąglana. Odczytywanie kwot z tekstu ma u nas dłuższą historię, opisaną w tekście o tym, dlaczego usunęliśmy nasz parser wydatków. Jak wyjazd w jenach dzieli się bez tych kłopotów, opisuje tekst o aplikacjach do dzielenia rachunków w Japonii.
Co jeszcze arkusz robi z pieniędzmi
Excel przechowuje liczby w binarnej reprezentacji zmiennoprzecinkowej, a niektóre ułamki dziesiętne nie mają dokładnej postaci binarnej. Własna notatka Microsoftu o arytmetyce zmiennoprzecinkowej w Excelu wyjaśnia, dlaczego suma może wyjść odrobinę inna niż oczekiwana. Przez większość czasu wyświetlanie to ukrywa i właśnie dlatego komórka, którą widzisz, i wartość, którą dodajesz, mogą się różnić.
Funkcje zaokrąglające też mają własne reguły. Funkcja ROUND w Excelu i ROUND w Arkuszach Google zaokrąglają każdą komórkę osobno, nic nie wiedząc o pozostałych komórkach podziału. Na tym polega cała różnica: podział musi zaokrąglać udziały razem, tak aby nadal sumowały się do rachunku.
Dimesum nigdy nie przechowuje pieniędzy jako ułamka jednostki. Każda kwota to liczba całkowita centów albo jenów, z walutą zapisaną obok, a każdy podział dokładnie zachowuje swoją sumę. Jeśli mimo to wolisz prowadzić pieniądze grupy w arkuszu, nasz szablon do śledzenia wspólnych wydatków to uczciwy początek, a tekst arkusz kalkulacyjny czy aplikacja do wspólnych wydatków omawia, gdzie arkusz przestaje wystarczać.
Jak sprawić, by twój arkusz zgadzał się z aplikacją
Możesz odtworzyć liczby Dimesum ręcznie. Pracuj w pełnych centach. Daj każdej osobie całe centy poniżej jej dokładnego udziału, policz pozostałe centy i rozdaj je po jednym.
- Zamień rachunek na centy: 100,00 USD to 10 000.
- Daj każdej osobie część całkowitą jej dokładnego udziału: po 3333, razem 9999.
- Przekaż pozostały cent osobie, którą aplikacja pokazuje jako jego nosiciela, i sprawdź, czy udziały sumują się do 10 000.
- Prowadź jeden arkusz na każdą walutę i nigdy nie stawiaj SUMY obejmującej dwie z nich.
Krok trzeci to jedyny, którego nie przewidzisz bez hasha rachunku, więc odczytaj go z samego rachunku. Dłuższą arytmetykę dla dowolnego podziału, z wagami i procentami, znajdziesz w tekście o metodzie kalkulatora do dzielenia wydatków, a ten sam sprawdzian zastosowany do całej historii grupy w tekście o tym, jak śledzić, kto komu jest winien na wyjeździe.
Czego to nadal nie potrafi
Nie sprawi, że twój arkusz i aplikacja będą zgodne przy każdym rachunku bez wysiłku. Arkusz z jedną regułą zaokrąglania na kolumnę będzie się różnił od Dimesum o cent mniej więcej przy każdym rachunku, który zostawia resztę, a osoba ponosząca cent będzie się zmieniać z rachunku na rachunek. Tak właśnie działa ta reguła.
Nie sprawi też, że połączona suma będzie dokładna. Saldo pokazane w jednej walucie po uzgodnionym kursie ma charakter orientacyjny, a plan rozliczenia zbudowany na jego podstawie może się mylić o jedną najmniejszą jednostkę na przeliczenie. Dług, który się liczy, pozostaje w walucie, w której go wydano, i dlatego rozliczenie grupy odbywa się po jednej walucie naraz.
Sprawdzaj sumę, a nie każdą komórkę
Gdy aplikacja i twój arkusz różnią się o cent, dodaj udziały w rachunku: jeśli równają się kwocie całkowitej, cent jest u jednej osoby celowo. Żeby zobaczyć, u której, otwórz Dimesum, stuknij rachunek i odczytaj udział, który jest o jeden cent większy od pozostałych.
Często zadawane pytania
Dlaczego moja aplikacja do dzielenia rachunków różni się od Excela o jeden cent?
Bo Excel zaokrągla każdy udział osobno, a aplikacja zaokrągla udziały razem. Rachunek na 100,00 USD podzielony na trzy to w zaokrąglonym arkuszu trzy razy 33,33 USD, co sumuje się do 99,99 USD. Dimesum daje jednej osobie 33,34 USD, aby udziały sumowały się do 100,00 USD, a o tym, kto poniesie ten cent, decyduje stały hash rachunku.
Kto płaci dodatkowy cent, gdy rachunek dzieli się na trzy?
Jedna osoba, a w Dimesum o tym, która, decyduje hash samego rachunku. Udziały wylicza się metodą największych reszt, a miejsce, od którego zaczyna się rozdawanie pozostałych centów, jest przesuwane przez stały hash rachunku. Ten sam rachunek zawsze daje tę samą odpowiedź, a w wielu rachunkach cent trafia do każdej osoby mniej więcej równo.
Dlaczego Dimesum nie wybiera losowej osoby do nieparzystego centa?
Bo prawdziwe losowanie przenosiłoby cent przy każdej edycji rachunku. Dimesum na nowo przedstawia podział przy każdej edycji, więc nowe losowanie księgowałoby korektę dla pieniędzy, które nigdy się nie ruszyły. Stały hash rachunku zachowuje się jak losowy wybór w wielu rachunkach i daje za każdym razem tę samą odpowiedź dla jednego rachunku.
Czy mogę dodawać salda w dwóch walutach w jednej kolumnie arkusza?
Nie, taka suma nic nie znaczy. 90 € i 60 USD zsumowane do 150 to liczba bez waluty, więc nikt nie może jej być winien. Dimesum prowadzi saldo w podziale na waluty i nigdy nie dodaje między nimi; grupa może zobaczyć je połączone po uzgodnionym kursie, opisane tym kursem, a każdy dług pozostaje w walucie, w której go wydano.
Jak Dimesum dzieli jeny, skoro nie ma groszy?
W pełnych jenach, bo najmniejszą jednostką jena jest 1 ¥. Kolacja za 10 000 ¥ podzielona na trzy to 3334 ¥, 3333 ¥ i 3333 ¥, co sumuje się do 10 000 ¥. Arkusz sformatowany z dwoma miejscami po przecinku pokazuje 3333,33 ¥, czego nie zapłaci żadna moneta, a zaokrąglenie każdej komórki do pełnych jenów gubi 1 ¥ tak samo, jak arkusz w dolarach gubi cent.
Popularne wpisy
- Rozliczenie: wspólne wydatki w kilku przelewach4 min czytania
- Edycja wydatku musi na nowo określić podział8 min czytania
- Sześć błędów walutowych w podziale wydatków8 min czytania
- Aplikacje do dzielenia rachunków: 11 w rankingu13 min czytania
- Dopisywalna księga dla dokładnych sald wydatków8 min czytania