Blog
Cum stochează Boring Expenses banii (și de ce ca număr întreg)
Există un mod clasic de a pierde un ban. Întreabă aproape orice limbaj de programare cât face 0.1 + 0.2 și îți va răspunde
0.30000000000000004. Nu e o eroare a limbajului – așa funcționează numerele binare în virgulă mobilă. Nu pot reprezenta
exact majoritatea fracțiilor zecimale, așa că se strecoară mici erori. Pentru fizică e în regulă; pentru bani, nu.
Pentru o aplicație financiară, „aproximativ corect” e răspunsul greșit. De aceea Boring Expenses nu stochează niciodată o sumă ca număr zecimal.
Cea mai mică unitate, ca număr întreg
Trucul folosit dintotdeauna de software-ul financiar: calculezi în cea mai mică unitate și o păstrezi ca număr întreg. În loc
de 4,20 lei, stochezi 420 – numărul de bani. Numerele întregi sunt exacte. Adună, scade și totalizează toată ziua și nu se
adună niciun praf de rotunjire.
Boring Expenses merge un pas mai departe și stochează sumele în subunități foarte fine (gândește-te la „100 de milioane pe
unitate”), ceea ce lasă loc din plin pentru diverse monede și nevoi viitoare, păstrând totul un simplu Int. Conversia în
ce vezi pe ecran are loc doar la margini – când introduci o sumă și când o formatăm pentru afișare.
// Ilustrație, nu codul exact:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
De ce contează pentru tine
- Totalurile sunt exacte. Totalul lunii e totalul real, nu o cifră care alunecă cu un ban pe măsură ce lista crește.
- Sincronizarea e consecventă. Un număr întreg înseamnă același lucru pe iPhone, Watch și iPad. Nu e nimic ambiguu de reconciliat.
- Exporturile sunt de încredere. CSV-ul exportat se potrivește cu aplicația până la ban.
E o decizie mică, discretă – exact genul care ne place. N-o vei vedea niciodată, și asta e ideea: cifrele pur și simplu se potrivesc.