Blogg

Hur Boring Expenses lagrar pengar (och varför som heltal)

  • teknik
  • iOS
  • Swift

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

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.