Blog
Sådan gemmer Boring Expenses penge (og hvorfor som heltal)
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
- Totalerne er præcise. Månedens total er den rigtige total, ikke et tal, der glider en øre, efterhånden som listen vokser.
- Synkroniseringen er ensartet. Et heltal betyder det samme på iPhone, Watch og iPad. Der er intet tvetydigt at afstemme.
- Eksporterne er til at stole på. CSV-filen, du eksporterer, stemmer med appen på øren.
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.