Blogi

Miten Boring Expenses tallentaa rahaa (ja miksi kokonaislukuna)

  • tekniikka
  • iOS
  • Swift

On klassinen tapa hukata sentti. Kysy lähes miltä tahansa ohjelmointikieleltä, paljonko on 0.1 + 0.2, ja se vastaa 0.30000000000000004. Se ei ole kielen vika – binääriset liukuluvut toimivat näin. Ne eivät pysty esittämään useimpia desimaalimurtolukuja tarkasti, joten pieniä virheitä hiipii mukaan. Fysiikalle se riittää; rahalle ei.

Raha-apille ”suunnilleen oikein” on väärä vastaus. Siksi Boring Expenses ei koskaan tallenna summaa desimaalilukuna.

Pienin yksikkö kokonaislukuna

Temppu, jota rahaohjelmistot ovat aina käyttäneet, on laskea pienimmässä yksikössä ja pitää se kokonaislukuna. Sen sijaan, että tallentaisit 4,20 €, tallennat 420 – senttien määrän. Kokonaisluvut ovat tarkkoja. Laske yhteen, vähennä ja summaa koko päivän, eikä pyöristyspölyä kerry.

Boring Expenses menee askeleen pidemmälle ja tallentaa summat hyvin pieninä alayksikköinä (ajattele ”100 miljoonaa yksikköä kohden”), mikä jättää runsaasti tilaa eri valuutoille ja tuleville tarpeille, ja silti kaikki pysyy yksinkertaisena Int-arvona. Muunnos siihen, mitä näet näytöllä, tapahtuu vain reunoilla – kun kirjoitat summan ja kun muotoilemme sen näytettäväksi.

// Havainnollistus, ei tarkka koodi:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Miksi tällä on väliä sinulle

Se on pieni, huomaamaton päätös – juuri sellainen, josta pidämme. Et koskaan näe sitä, ja juuri se on tarkoitus: luvut vain täsmäävät.