Blog

Kako Boring Expenses pohranjuje novac (i zašto kao cijeli broj)

  • inženjerstvo
  • iOS
  • Swift

Postoji klasičan način da izgubite cent. Pitajte gotovo bilo koji programski jezik koliko je 0.1 + 0.2 i odgovorit će 0.30000000000000004. To nije greška jezika – tako rade binarni brojevi s pomičnim zarezom. Većinu decimalnih razlomaka ne mogu prikazati točno pa se uvuku sitne pogreške. Za fiziku je u redu; za novac nije.

Za financijsku aplikaciju „otprilike točno” pogrešan je odgovor. Zato Boring Expenses nikada ne pohranjuje iznos kao decimalni broj.

Najmanja jedinica kao cijeli broj

Trik koji financijski softver koristi oduvijek: računati u najmanjoj jedinici i držati je kao cijeli broj. Umjesto 4,20 € pohranite 420 – broj centi. Cijeli brojevi su točni. Zbrajajte, oduzimajte i sabirajte cijeli dan i nikakva prašina od zaokruživanja neće se nakupiti.

Boring Expenses ide korak dalje i pohranjuje iznose u vrlo finim podjedinicama (zamislite „100 milijuna po jedinici”), što ostavlja mnogo prostora za različite valute i buduće potrebe, a sve ostaje običan Int. Pretvorba u ono što vidite na zaslonu događa se samo na rubovima – kad upisujete iznos i kad ga oblikujemo za prikaz.

// Ilustracija, ne točan kod:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Zašto je to važno vama

To je mala, neupadljiva odluka – upravo onakva kakve volimo. Nikada je nećete vidjeti, i u tome je poanta: brojke se jednostavno slažu.