Blog
Kako Boring Expenses hrani denar (in zakaj je to celo število)
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
- Vsote so natančne. Vaša mesečna vsota je prava vsota, ne številka, ki se z rastjo seznama premakne za cent.
- Sinhronizacija ostaja skladna. Celo število pomeni isto na iPhonu, uri Watch in iPadu. Ni dvoumnosti, ki bi jo bilo treba usklajevati.
- Izvozom lahko zaupate. CSV, ki ga izvozite, se z aplikacijo ujema do centa.
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.