Blog

Cum stochează Boring Expenses banii (și de ce ca număr întreg)

  • inginerie
  • iOS
  • Swift

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

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.