Blog
Kako Boring Expenses pohranjuje novac (i zašto kao cijeli broj)
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
- Zbrojevi su točni. Mjesečni zbroj stvarni je zbroj, a ne broj koji klizi za cent kako popis raste.
- Sinkronizacija je dosljedna. Cijeli broj znači isto na iPhoneu, Watchu i iPadu. Nema ničega dvosmislenog za usklađivanje.
- Izvozi su pouzdani. CSV koji izvezete poklapa se s aplikacijom do centa.
To je mala, neupadljiva odluka – upravo onakva kakve volimo. Nikada je nećete vidjeti, i u tome je poanta: brojke se jednostavno slažu.