Avrundning delad nota: varför appen och arket skiljer sig
En nota på $100.00 delad på tre lämnar en cent som ett kalkylark tappar och som Dimesum ger till en person, vald av en fast hash av notan. Här är den uträknade tabellen, regeln vi ersatte och de två valutamisstag som bara ett ark kan göra.
Ditt kalkylark säger $66.66 och appen säger $66.67. Den enda centen är avrundning när en nota delas, och det är det vanligaste meddelandet vi får från någon som kontrollerat Dimesum mot Excel. Det korta svaret: arket avrundar varje andel för sig och tappar den överblivna centen, medan Dimesum ger den centen till en person, vald av en fast hash av notan, så att andelarna alltid summerar tillbaka till totalen.
Problemet, orsaken och lösningen, i tre meningar du kan lyfta. En nota på $100.00 delad på tre kan inte betalas med tre lika belopp, så någon bär $33.34. Ett kalkylark som avrundar varje cell visar $33.33 tre gånger och tappar i tysthet en cent, medan Dimesum behåller centen och avgör vem som bär den utifrån notans egen hash. De två stämmer överens på varje nota som går jämnt upp och skiljer sig med högst en cent per person på varje nota som inte gör det.
Symptomet: en cent som ena sidan har och den andra inte
Rapporten kommer oftast på samma sätt. Någon exporterar en månads notor, bygger upp saldona igen i ett ark och hittar några centers skillnad. Ingenting saknas på någon av sidorna med mer än en cent per nota, och ändå kan ingen få de två att stämma.
Vi skrev om de fyra skälen till att ett gruppsaldo ser fel ut i därför stämmer aldrig era delade saldon. Det här inlägget tar det första av dem, den avrundade centen, och följer den in i ett kalkylark, eftersom det är dit en noggrann person går för att kontrollera oss. Det tar också upp de två ställen där ett ark går fel som en app inte kan: att lägga ihop två valutor i en kolumn, och att ge yenen två decimaler den inte har.
En nota på $100.00, på tre, i ett ark och i appen
Emma betalar $100.00 för middagen. Lucas, Sofia och Emma delar den lika. Hundra dollar delat med tre är $33.333 och så vidare i all evighet, vilket inget kort kan betala.
Ett ark kan hålla det oändliga talet. Skriv =100/3 i tre celler, formatera dem med två decimaler, och var och en visar $33.33. Summacellen visar $100.00, eftersom den lägger ihop de dolda siffrorna snarare än dem som syns på skärmen. Nu lägger en läsare ihop de tre synliga cellerna på en miniräknare och får $99.99.
Det noggranna arket avrundar i stället: =ROUND(100/3, 2) i varje cell. Nu innehåller varje cell verkligen $33.33, summan är verkligen $99.99, och centen har lämnat arket. Emma har $33.33 att få av Lucas och $33.33 av Sofia, så arket säger att hon får tillbaka $66.66. Hennes egen andel skulle vara $33.33, men hon har betalat $33.34 av middagen utan att någon skrev ner det.
| Var den delades | Emmas andel | Lucas andel | Sofias andel | Andelarna summerar till | Emma har att få |
|---|---|---|---|---|---|
| Dimesum, en nota vars hash ger Emma den udda centen | $33.34 | $33.33 | $33.33 | $100.00 | $66.66 |
| Dimesum, en nota vars hash ger Lucas den udda centen | $33.33 | $33.34 | $33.33 | $100.00 | $66.67 |
Ark, =100/3 visat med två decimaler | $33.33 | $33.33 | $33.33 | $100.00 i SUMMA, $99.99 på skärmen | $66.67 på skärmen |
Ark, =ROUND(100/3, 2) | $33.33 | $33.33 | $33.33 | $99.99 | $66.66 |
Varje rad är en uträkning du kan göra om.
På den andra raden för Dimesum är Lucas skyldig $33.34 och Sofia $33.33, och $33.34 plus $33.33 är $66.67. I det avrundade arket är $33.33 plus $33.33 lika med $66.66. Ingen av dem är en bugg. De är två olika regler om en cent, och bara en av dem behåller centen i registret.
Varför varje andel först avrundas nedåt
Dimesum delar med största restmetoden, en regel som vissa parlament använder för att göra om röstandelar till hela mandat. Varje belopp lagras som ett heltal av valutans minsta enhet, så $100.00 är 10,000 cent. Varje persons exakta andel räknas ut som ett bråktal, och sedan får alla de hela cent som ligger under det: 3,333 var, vilket blir 9,999.
Det lämnar en cent. De överblivna centen delas ut en i taget, till dem vars bråkdelar skars mest. Vid en lika delning är allas bråkdel densamma, en tredjedels cent, så regeln behöver ett sätt att bryta lika läge. Det var där vår första version gick fel.
Garantin metoden ger är den som ett ark inte kan ge: andelarna summerar exakt tillbaka till totalen, och ingen andel ligger mer än en cent från sitt exakta värde. Samma uträkning körs för en lika delning, en procentdelning, viktade andelar, varje rad på en specificerad nota och varje pott för skatt eller dricks på den. Vårt inlägg om appar för att dela en nota per artikel visar den på en middag för fyra personer med rabatt.
Det vi provade först: den äldsta medlemmen tog varje udda cent
Det första sättet att bryta lika läge var det uppenbara. Medlemmar ordnas efter när de gick med, så lika lägen gick till den äldsta medlemmen. Det är deterministiskt, det är lätt att testa, och på en enskild nota kunde ingen kalla det orättvist.
Över ett år är det ett påslag. En lägenhet med tre personer delar hyra, el, internet och matinköp, och många av de notorna lämnar en cent över. Varenda en av de centen gick till samma person, den som startade gruppen. En cent är ingenting; några hundra av dem åt samma håll är ett mönster som någon till slut ser i ett ark.
Grundarens svar den 21 augusti 2026 var att en slumpvis deltagare skulle bära den, så att det jämnar ut sig över många notor. Slumpen hade en hake för oss. Dimesum räknar om en notas delning varje gång den ändras, och en ändring registreras som en ny post som anger delningen på nytt, som beskrivs i varför en ändring måste ange sin delning på nytt. Med en verklig slumpdragning skulle en ändring som bara bytte notans namn dra om, flytta centen till någon annan och bokföra en rättelse för pengar som aldrig rörde sig.
Lösningen: rotera den udda centen med en fast hash av notan
Så slumpen blev skenbar och fast. Varje nota har sitt eget id, och vi hashar det med FNV-1a, en liten hash som ger samma svar på varje maskin och i varje bygge. Hashen väljer var i den ordnade listan de överblivna centen börjar. Samma nota, samma svar, varje gång den räknas ut; över många notor landar startpunkten ungefär lika ofta på varje person.
Den ordnade listan är fortfarande största restmetodens ordning, med lika lägen brutna med äldsta medlemmen först. Hashen flyttar bara var utdelningen börjar. Vid en lika delning på tre betyder det att varje nota väljer en av de tre personerna att bära $33.34, och det valet ändras aldrig för den notan.
Det är därför ditt ark och appen skiljer sig på olika sätt på olika notor. På en middag för $100.00 ger hashen Emma centen och de två är överens om att hon har $66.66 att få. På nästa ger den Lucas centen och appen säger $66.67. Ett ark med en regel för varje rad kan inte återskapa det, om det inte kopierar hashen.
Kostnaden vi accepterade
Två notor med identiskt innehåll kan nu skilja sig med en cent. Två middagar för $100.00 med samma tre personer kan delas som $33.34 för Emma på den ena och $33.34 för Sofia på den andra. Två av våra egna tester från början till slut jämförde en notas andelar med en annans och gick sönder den dag det här släpptes; nu kontrollerar de regelns resultat i stället.
Vi tycker att det är rätt avvägning. Liggaren under varje saldo lägger bara till, så en cent som flyttar sig utan skäl skulle skrivas ner för alltid; designen finns i liggaren som bara lägger till bakom varje delning. En cent som är fast per nota och fördelad över personer behöver aldrig någon rättelse.
En kolumn som lägger ihop dollar och euro är ingen summa
Den andra skillnaden är större än en cent och den är alltid arkets. På en resa betalar Emma en hotellnatt för €90 och en museibiljett för $60, och arket har en kolumn Belopp med en SUMMA längst ner. Den säger 150. Det talet har ingen valuta, så ingen kan vara skyldig det.
Dimesum håller varje saldo per valuta och lägger aldrig ihop dem. Gruppen ser vad som är skyldigt i euro och, separat, vad som är skyldigt i dollar. Om gruppen kommer överens om en kurs kan Dimesum visa saldona sammanslagna till en valuta, märkta med kursen, och själva skulden stannar i den valuta den spenderades i.
Buggarna som kommer av att göra annorlunda finns i pengabuggarna som en andra valuta orsakar. Om det är en resa som är skälet till att du jämför ställer appar för att dela utgifter i flera valutor upp hur andra appar hanterar en andra valuta.
Sammanslagning för med sig en egen avrundning. En växling avrundar till hela cent, med halva bort från noll, så saldon som summerade till noll i yen kan summera till en cent över i dollar. Vi låter medlemmen med lägst id ta upp högst en minsta enhet per växling, och utöver det avvisas uppgörelseplanen. En plan som i tysthet har fel med $1 är värre än ett fel, eftersom någon skulle betala den.
Yenen har inga cent, och ett ark ger den två ändå
Den tredje skillnaden dyker upp på varje resa till Japan. Yenen har ingen mindre enhet: dess exponent i valutastandarden ISO 4217 är noll, så ¥1 är det minsta belopp någon kan betala. En middag för ¥10,000 delad på tre i Dimesum blir ¥3,334, ¥3,333 och ¥3,333, vilket summerar till ¥10,000.
Ett ark formaterat för pengar visar ¥3,333.33 tre gånger, en siffra som inget mynt betalar. Avrunda till hela yen så visar det ¥3,333 tre gånger, vilket summerar till ¥9,999. Yenen tappar en enhet på samma sätt som dollarn tappade en cent.
Vi förstörde det här själva innan vi rättade det.
Koden som läser ut ett belopp ur en textrad gjorde en gång om det till mindre enheter genom att multiplicera med 100, vilket är rätt för dollar och euro och fel för yen: en taxi för ¥2,000 blev ¥200,000. Det var ett fel med en faktor 100, och ingen avrundningsregel hade kunnat fånga det.
Växlingen läser nu varje valutas exponent från ISO-tabellen, och en siffra som är finare än en valutas minsta enhet avvisas i stället för att avrundas. Att läsa belopp ur text har en längre historia hos oss, berättad i varför vi raderade vår utgiftsparser. Hur en resa i yen delas utan de problemen finns i appar för att dela notan i Japan.
Vad mer ett kalkylark gör med pengar
Excel lagrar tal som binära flyttal, och vissa decimaltal har ingen exakt binär form. Microsofts egen anteckning om flyttalsaritmetik i Excel förklarar varför en summa kan bli en aning fel jämfört med siffran du väntar dig. Oftast döljer visningen det, vilket är precis varför cellen du ser och värdet du lägger ihop kan skilja sig.
Avrundningsfunktionerna har också sina egna regler. Excels funktion AVRUNDA (ROUND) och ROUND i Google Kalkylark avrundar varje cell för sig, utan kännedom om de andra cellerna i delningen. Det är hela skillnaden: en delning måste avrunda andelarna tillsammans, så att de fortfarande summerar till notan.
Dimesum lagrar aldrig pengar som en bråkdel av en enhet. Varje belopp är ett heltal av cent, eller av yen, med sin valuta skriven bredvid, och varje delning bevarar sin total exakt. Om du ändå hellre håller gruppens pengar i ett ark är vår mall för att följa gemensamma utgifter en rimlig start, och kalkylark eller app för gemensamma utgifter tar upp var arket slutar räcka till.
Så får du ditt ark att stämma med appen
Du kan återskapa Dimesums siffror för hand. Arbeta i hela cent. Ge varje person de hela cent som ligger under hens exakta andel, räkna de cent som blir över och dela ut dem en i taget.
- Gör om notan till cent: $100.00 är 10,000.
- Ge varje person golvet av hens exakta andel: 3,333 var, 9,999 totalt.
- Ge den överblivna centen till den person appen visar som bärare av den, och kontrollera att andelarna summerar till 10,000.
- Håll ett ark per valuta, och lägg aldrig en SUMMA över två av dem.
Steg tre är det enda du inte kan förutsäga utan notans hash, så läs av det på notan i stället. Den längre uträkningen för vilken delning som helst, med vikter och procent, finns i kalkylatormetoden för att dela utgifter, och samma kontroll tillämpad på en grupps hela historik finns i hur du håller koll på vem som är skyldig vem på en resa.
Det här kan det fortfarande inte göra
Det kan inte få ditt ark och appen att stämma på varje nota utan ansträngning. Ett ark med en avrundningsregel per kolumn kommer att skilja sig från Dimesum med en cent på ungefär varje nota som lämnar en rest, och personen som bär centen kommer att växla från nota till nota. Det är regeln som fungerar.
Det kan inte heller göra en sammanslagen summa exakt. Ett saldo som visas i en valuta till en överenskommen kurs är vägledande, och uppgörelseplanen som byggs från det kan ligga en minsta enhet fel per växling. Skulden som räknas stannar i den valuta den spenderades i, vilket är skälet till att att göra upp en grupp sker en valuta i taget.
Kontrollera summan, inte varje cell
När appen och ditt ark skiljer sig med en cent, lägg ihop andelarna på notan: om de är lika med totalen ligger centen hos en person med avsikt. För att se vilken person, öppna Dimesum, tryck på notan och läs av den andel som är en cent större än de andra.
Vanliga frågor
Varför skiljer sig min app för att dela notan med en cent från Excel?
Eftersom Excel avrundar varje andel för sig och appen avrundar andelarna tillsammans. En nota på $100.00 delad på tre blir $33.33 tre gånger i ett avrundat ark, vilket summerar till $99.99. Dimesum ger en person $33.34 så att andelarna summerar till $100.00, och en fast hash av notan avgör vem som bär den centen.
Vem betalar den extra centen när en nota delas på tre?
En person, och i Dimesum avgör notans egen hash vem. Andelarna räknas fram med största restmetoden, och platsen där de överblivna centen börjar roteras av en fast hash av notan. Samma nota ger alltid samma svar, och över många notor landar centen ungefär lika ofta på varje person.
Varför väljer inte Dimesum en slumpvis person för den udda centen?
Eftersom en verklig slumpdragning skulle flytta centen varje gång en nota ändras. Dimesum anger delningen på nytt vid varje ändring, så en ny dragning skulle bokföra en rättelse för pengar som aldrig rörde sig. En fast hash av notan beter sig som ett slumpval över många notor och ger samma svar varje gång för en nota.
Kan jag lägga ihop saldon i två valutor i en kolumn i ett kalkylark?
Nej, summan betyder ingenting. €90 och $60 summerat till 150 är ett tal utan valuta, så ingen kan vara skyldig det. Dimesum håller ett saldo per valuta och lägger aldrig ihop dem; en grupp kan se dem sammanslagna till en kurs den kommer överens om, märkta med den kursen, medan varje skuld stannar i den valuta den spenderades i.
Hur delar Dimesum yen när det inte finns några cent?
I hela yen, eftersom yenens minsta enhet är ¥1. En middag för ¥10,000 delad på tre blir ¥3,334, ¥3,333 och ¥3,333, vilket summerar till ¥10,000. Ett ark formaterat med två decimaler visar ¥3,333.33, vilket inget mynt kan betala, och att avrunda varje cell till hela yen tappar ¥1 på samma sätt som ett ark i dollar tappar en cent.
Populära inlägg
- Gör upp: reglera gruppens utgifter med färre överföringar5 min läsning
- Varför en ändrad utgift måste ange delningen på nytt8 min läsning
- Sex pengabuggar i utgiftsdelning med flera valutor8 min läsning
- Bästa apparna för att dela notan: 11 rankade14 min läsning
- Journalen som håller delade utgifter exakta8 min läsning