Blogg
Hur Boring Expenses lagrar pengar (och varför som heltal)
Här är ett klassiskt sätt att tappa ett öre. Fråga nästan vilket programspråk som helst vad 0.1 + 0.2 blir, så svarar det
0.30000000000000004. Det är ingen bugg i språket – det är så binära flyttal fungerar. De kan inte representera de flesta
decimalbråk exakt, så små fel smyger sig in. Bra nog för fysik; inte för pengar.
För en pengaapp är ”ungefär rätt” fel svar. Därför lagrar Boring Expenses aldrig ett belopp som decimaltal.
Lagra den minsta enheten som heltal
Tricket som pengaprogram alltid har använt är att räkna i den minsta enheten och hålla den som heltal. I stället för
4,20 kr lagrar du 420 – antalet ören. Heltal är exakta. Addera, subtrahera och summera hela dagen utan att något
avrundningsdamm samlas.
Boring Expenses går ett steg längre och lagrar belopp i mycket fina delenheter (tänk ”100 miljoner per enhet”), vilket ger
gott om utrymme för olika valutor och framtida behov samtidigt som allt förblir en enkel Int. Omvandlingen till det du ser
på skärmen sker bara i kanterna – när du skriver in ett belopp och när vi formaterar det för visning.
// Illustration, inte den exakta koden:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Därför spelar det roll för dig
- Summorna är exakta. Månadens summa är den riktiga summan, inte en siffra som glider ett öre i taget när listan växer.
- Synken är konsekvent. Ett heltal betyder samma sak på iPhone, Watch och iPad. Det finns inget tvetydigt att stämma av.
- Exporterna går att lita på. CSV-filen du exporterar stämmer med appen på öret.
Det är ett litet, odramatiskt beslut – precis den sortens beslut vi gillar. Du kommer aldrig att se det, och det är poängen: siffrorna går bara ihop.