Del regningen når én ret ikke blev delt
Del en middag til 3.675 kr ligeligt, og én person betaler i stilhed 490 kr for en ret de aldrig rørte, og løsningen er én udgift med to regler, navngiv hvem der spiste den udelte linje, og lad skatten følge forbruget.
Del en middag til 3.675 kr ligeligt, og én person betaler 490 kr for meget. To af de tre spiste havplatten til 1.400 kr, og den tredje gjorde ikke, men en ligelig deling opkræver alle tre 1.225 kr. Dimesum håndterer den regning som én udgift: ligeligt i toppen, med linjen på 1.400 kr båret kun af de to der bestilte den.
Regninger der næsten er ligelige med én udelt linje er det mest almindelige en delingsapp bliver bedt om, og Dimesums første datamodel kunne ikke udtrykke sådan en. Det tidligere design gjorde ITEMIZED til en delingstype, gensidigt udelukkende med EQUAL, PERCENT og SHARES. En rigtig restaurantregning er begge dele på én gang.
At specificere er en detalje på en udgift, ikke en anden slags deling
En specificeret udgift i Dimesum er en almindelig udgift der tilfældigvis bærer sine linjer. Udgiften beholder alt hvad udgifter allerede har: en total, deltagere, en delingstype, en eller flere betalere. Til det føjer den varelinjer, regningens linjer, og justeringer, momsen, drikkepengene, gebyrerne og rabatterne der står trykt under dem.
To niveauer afgør så hver øre. Udgiftens delingstype deler enhver linje uden nogen navngivet på den. En linje med tildelte bæres af præcis de personer og af ingen andre.
| Niveau | Hvad det afgør | Gælder for |
|---|---|---|
| Udgiftens delingstype | Hvordan en delt omkostning deles: ligeligt, efter procent eller efter vægtede andele | Hver vare uden nogen tildelt navngivet |
| Vares tildelte | Hvem der forbrugte denne linje, og i hvilken andel | Kun den linje |
En middag til 3.675 kr hvor den der spiste mindst betaler 735 kr
Asha, Bhavna og Chetan spiser middag, delt ligeligt i toppen. Delte retter kommer til 2.100 kr. En havret kommer til 1.400 kr, og kun Asha og Bhavna spiste den. Service er 5%, og Chetan betalte hele beløbet på 3.675 kr.
| Linje | Beløb | Asha | Bhavna | Chetan |
|---|---|---|---|---|
| Delte retter, ingen tildelte | 2.100 kr | 700 kr | 700 kr | 700 kr |
| Havplatte, Asha og Bhavna | 1.400 kr | 700 kr | 700 kr | 0 kr |
| Subtotal | 3.500 kr | 1.400 kr | 1.400 kr | 700 kr |
| Service 5%, efter subtotal | 175 kr | 70 kr | 70 kr | 35 kr |
| Total | 3.675 kr | 1.470 kr | 1.470 kr | 735 kr |
Chetan betalte 3.675 kr og skylder 735 kr, så han har 2.940 kr til gode: 1.470 kr fra Asha og 1.470 kr fra Bhavna. Hvem der betalte er uafhængigt af hvem der skylder. At betaleren er den person der næsten ikke spiste ændrer ingen af andelene, hvilket er grunden til at Dimesum holder betalere på udgiftsniveau og tildelte på linjeniveau.
Skat følger hvad du spiste, ikke hvor mange I er
Chetans andel af servicegebyret på 175 kr er 35 kr, ikke 58,33 kr. Hver justering fordeles i forhold til hver persons vare-subtotal, så madens deling 1.400:1.400:700 afgør også delingen af servicegebyret. At fordele efter hovedtal ville stille og roligt opkræve Chetan skat på en ret han aldrig rørte.
En der ikke bestilte noget betaler derfor ingen skat og får ingen rabat. Vægtene er subtotalerne før justering frem for den løbende total, hvilket også forhindrer hver justerings afrunding i at vokse ind i den næstes vægte.
Justeringer gælder i rækkefølge, så en rabat flytter momsgrundlaget
En regning der lyder "7.000 kr, minus 10%, plus 5% moms" opkræver moms på 6.300 kr, og momslinjen er 315 kr. Byt de to om, og momsen opkræves på 7.000 kr, hvilket giver 350 kr. Justeringer er en ordnet liste, og en procentdel gælder for den løbende total på sin egen plads. Begge rækkefølger er rigtige regninger, så listen er ordnet frem for en mængde.
Hver justering bærer sin egen position. En rækkefølge der hvilede på indsætningsrækkefølge, eller på at en id-generator forblev monoton, ville stille og roligt ændre hvad alle skylder efter en databasegendannelse.
Tre valideringer står mellem en tastefejl og aritmetikken. En pulje angiver enten et fast beløb eller en sats i basispoint, aldrig begge, fordi at gemme begge gemmer et tal og dets egen udledning. Et negativt beløb afvises, med en fejl der navngiver DISCOUNT som måden at skrive en reduktion. En sats over 100.000 basispoint afvises også, et loft sat langt over de 10.000 basispoint der betyder 100%, fordi hundrede procent rabat er en rigtig rabat.
| Type | Effekt på den løbende total | Hvorfor det er sin egen type |
|---|---|---|
TAX | Lægger til | Kun ordvalg; identisk med beregningen |
TIP | Lægger til | Kun ordvalg; identisk med beregningen |
FEE | Lægger til | Kun ordvalg; identisk med beregningen |
DISCOUNT | Trækker fra | Den eneste type der ændrer aritmetikken, så retningen kommer fra typen og aldrig fra et fortegn |
Totalen kommer fra linjerne, og en indtastet total er kun en kontrolsum
En specificeret total udledes: summen af varerne plus summen af justeringerne. Linjerne siger allerede hvad regningen koster, så en separat angivet total ville være en anden kilde til sandhed der kan være uenig med den første. En der taster en regning forkert ind retter en linje, hvor fejlen faktisk er, og totalen følger med. At rette en regning der allerede er bogført går gennem en redigering der genudtrykker sin deling, så rettelsen lander som en ny version frem for som en overskrivning.
En klient kan stadig sende amount_minor, og Dimesum behandler det så som en kontrolsum frem for som svaret. Enighed betyder at klienten læste den samme regning. Uenighed stopper udgiften før nogen penge flytter sig.
En tidligere version tilføjede automatisk en "Andet"-linje for hvad end en angivet total ikke gjorde rede for, og fjernede linjen når forskellen lukkede. Den linje virkede, og den er væk. At udlede totalen opløste det problem "Andet"-linjen fandtes for at håndtere, som kun opstod fordi totalen blev angivet to gange.
Hvorfor EXACT og varer afvises sammen
EXACT navngiver hvert medlems endelige beløb. Varer udleder hvert medlems beløb. Begge på én gang er overbestemt: enten er de enige, i hvilket tilfælde den ene er overflødig, eller de er uenige, i hvilket tilfælde udgiften har to svar og ingen regel siger hvilket der vinder. Dimesum afviser kombinationen ved døren frem for at afgøre den med en forrangsregel ingen ville huske.
EQUAL, PERCENT og SHARES kombineres alle med varer, fordi hver især er en regel for at dele en delt omkostning frem for en mængde endelige beløb.
Hvor en rabat plejede at miste en øre
Hver fordeling bruger største rest-metoden, og hver enkelt bevarer sin egen total præcist. Uafgjorte i den metode gik før til det laveste medlems-id, hvilket gav gruppens ældste medlem den ekstra øre på hver ligeligt delt udgift; det uafgjorte roterer nu på et hash af udgiftens id. Delte linjer puljes og deles én gang frem for linje for linje, så den skæve øre ikke lander på det samme medlem for hver linje på regningen.
Vores apportion-funktion havde en rigtig defekt her. Go's heltalsdivision afkorter mod nul, så en negativ total blev afrundet den forkerte vej og resten blev aldrig delt ud: −70,00 kr over vægtene 100, 200 og 300 kom tilbage som −69,99 kr. En forsvundet øre ville have fået en korrekt rabatteret regning til at fejle sin egen sumkontrol, og brugeren ville være blevet fortalt at deres aritmetik var forkert. Negative totaler fordeles nu efter størrelse og negeres tilbage.
Indtast regningen som den er trykt
Tast de linjer du kan se, navngiv de personer der spiste dem der ikke blev delt, og tilføj moms, drikkepenge, gebyr og rabat i den rækkefølge kvitteringen trykker dem. Dimesum udleder totalen, fordeler hver justering efter hvad hver person forbrugte, og lader betaleren være udenfor. Næste gang én ret koster dobbelt så meget som alle andre bestilte, tilføj den som sin egen linje med to navne på.
Ofte stillede spørgsmål
Hvordan deler man en restaurantregning når én har bestilt noget dyrt?
Sæt den ret på sin egen linje og navngiv de personer der spiste den. I Dimesum deles resten af regningen stadig efter udgiftens egen regel, som regel ligeligt, mens den navngivne linje kun bæres af sine tildelte. Skat og service fordeles derefter efter hver persons subtotal, så den der sprang retten over betaler mindre af begge.
Skal skat og drikkepenge deles ligeligt eller efter hvad hver har bestilt?
Efter hvad hver person bestilte. Dimesum fordeler hver justering i forhold til hver persons vare-subtotal frem for efter hovedtal. I en middag til 3.675 kr hvor én person spiste mad for 700 kr, bærer den person 35 kr af et servicegebyr på 175 kr i stedet for 58,33 kr. Enhver der ikke bestilte noget betaler slet ingen skat.
Ændrer rækkefølgen af en rabat og en moms hvad regningen koster?
Ja. Justeringer gælder i rækkefølge mod en løbende total, så en regning der lyder '7.000 kr, minus 10%, plus 5% moms' opkræver momsen på 6.300 kr, og momslinjen er 315 kr. Sæt momsen først, og den opkræves på 7.000 kr, hvilket giver 350 kr. Med en fast rabat på 700 kr er totalerne også forskellige, 6.615 kr mod 6.650 kr.
Hvorfor kan man ikke bruge præcise beløb på en specificeret regning?
EXACT navngiver hver persons endelige beløb og varer udleder det, så de to sammen giver én udgift to svar. Dimesum afviser kombinationen frem for at kåre en vinder med en forrangsregel ingen ville huske. EQUAL, PERCENT og SHARES virker alle sammen med varer, fordi hver især er en regel for at dele delte linjer frem for en mængde endelige beløb.
Skal man taste totalen på en specificeret regning?
Nej. Dimesum udleder en specificeret total som summen af varerne plus summen af justeringerne, fordi linjerne allerede siger hvad regningen koster. En total sendt af en klient tjekkes som en kontrolsum, og en uoverensstemmelse stopper udgiften før penge flytter sig. At rette et forkert tal betyder at rette den linje det kom fra.
Populære indlæg
- Append-only-hovedbog for præcise delte balancer8 min læsning
- Derfor skal en redigering angive fordelingen igen8 min læsning
- Seks pengefejl i udgiftsdeling på tværs af valutaer8 min læsning
- Gør op: ryd fælles udgifter med færre overførsler5 min læsning
- Del huslejen retfærdigt med dine bofæller5 min læsning