Blog

Kako Boring Expenses hrani denar (in zakaj je to celo število)

  • razvoj
  • ios
  • swift

Tu je klasičen način, kako izgubiti cent. Vprašajte skoraj kateri koli programski jezik, koliko je 0.1 + 0.2, in odgovoril bo 0.30000000000000004. To ni napaka jezika — tako delujejo dvojiška števila s plavajočo vejico. Večine decimalnih ulomkov ne morejo predstaviti natančno, zato se prikradejo drobne napake. Za fiziko v redu; za denar ne.

Za finančno aplikacijo je »dovolj blizu« napačen odgovor. Zato Boring Expenses zneska nikoli ne hrani kot decimalno število.

Najmanjšo enoto hranite kot celo število

Trik, ki ga finančna programska oprema uporablja od nekdaj, je delo v najmanjši enoti, ki jo hranite kot celo število. Namesto 4,20 € hranite 420 — število centov. Cela števila so natančna. Seštevajte, odštevajte in računajte vsote ves dan, pa se ne bo nabral prav nič prahu zaokroževanja.

Boring Expenses gre še korak dlje in zneske hrani v zelo drobnih podenotah (pomislite na »100 milijonov na celo enoto«), kar pušča veliko rezerve za valute in prihodnje potrebe, vse pa ostane navaden Int. Pretvorba v to, kar dejansko vidite na zaslonu, in nazaj se zgodi čisto na robovih — ko znesek vtipkate in ko ga oblikujemo za prikaz.

// Ponazoritev, ne točna koda:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Zakaj je to pomembno za vas

To je majhna, neglamurozna odločitev — natanko take imamo radi. Nikoli je ne boste videli, in v tem je bistvo: številke se preprosto seštejejo.