Blog

Sådan gemmer Boring Expenses penge (og hvorfor som heltal)

  • teknik
  • iOS
  • Swift

Her er en klassisk måde at miste en øre på. Spørg næsten et hvilket som helst programmeringssprog, hvad 0.1 + 0.2 giver, og det svarer 0.30000000000000004. Det er ikke en fejl i sproget – sådan virker binære kommatal. De kan ikke gengive de fleste decimalbrøker præcist, så små fejl sniger sig ind. Fint til fysik; ikke til penge.

For en pengeapp er ”nogenlunde rigtigt” det forkerte svar. Derfor gemmer Boring Expenses aldrig et beløb som et decimaltal.

Gem den mindste enhed som heltal

Tricket, som pengesoftware altid har brugt, er at regne i den mindste enhed og holde den som heltal. I stedet for 4,20 kr. gemmer du 420 – antallet af ører. Heltal er præcise. Læg sammen, træk fra og summér hele dagen, og der samler sig aldrig afrundingsstøv.

Boring Expenses går et skridt videre og gemmer beløb i meget fine underenheder (tænk ”100 millioner pr. enhed”), hvilket giver masser af plads til forskellige valutaer og fremtidige behov, mens alt forbliver en simpel Int. Omregningen til det, du ser på skærmen, sker kun i kanterne – når du skriver et beløb, og når vi formaterer det til visning.

// Illustration, ikke den præcise kode:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Derfor betyder det noget for dig

Det er en lille, udramatisk beslutning – præcis den slags, vi kan lide. Du kommer aldrig til at se den, og det er pointen: tallene går bare op.