Blogg

Slik lagrer Boring Expenses penger (og hvorfor som heltall)

  • teknikk
  • iOS
  • Swift

Her er en klassisk måte å miste en øre på. Spør nesten hvilket som helst programmeringsspråk hva 0.1 + 0.2 blir, og det svarer 0.30000000000000004. Det er ikke en feil i språket – det er slik binære flyttall virker. De kan ikke gjengi de fleste desimalbrøker nøyaktig, så små feil sniker seg inn. Greit for fysikk; ikke for penger.

For en pengeapp er «omtrent riktig» feil svar. Derfor lagrer Boring Expenses aldri et beløp som et desimaltall.

Lagre den minste enheten som heltall

Trikset pengeprogrammer alltid har brukt, er å regne i den minste enheten og holde den som heltall. I stedet for kr 4,20 lagrer du 420 – antallet øre. Heltall er nøyaktige. Legg sammen, trekk fra og summer hele dagen uten at noe avrundingsstøv samler seg.

Boring Expenses går et steg videre og lagrer beløp i svært fine underenheter (tenk «100 millioner per enhet»), noe som gir god plass til ulike valutaer og framtidige behov, samtidig som alt forblir en enkel Int. Omregningen til det du ser på skjermen skjer bare i kantene – når du skriver inn et beløp, og når vi formaterer det for visning.

// Illustrasjon, ikke den nøyaktige koden:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Derfor betyr det noe for deg

Det er en liten, udramatisk avgjørelse – akkurat den typen vi liker. Du kommer aldri til å se den, og det er poenget: Tallene går bare opp.