Blog
Jak Boring Expenses ukládá peníze (a proč jako celé číslo)
Existuje klasický způsob, jak přijít o halíř. Zeptejte se skoro jakéhokoli programovacího jazyka, kolik je 0.1 + 0.2, a
odpoví 0.30000000000000004. To není chyba jazyka – tak fungují binární čísla s plovoucí čárkou. Většinu desetinných zlomků
neumějí vyjádřit přesně, takže se vloudí drobné chyby. Pro fyziku v pořádku, pro peníze ne.
Pro finanční aplikaci je „přibližně správně“ špatná odpověď. Proto Boring Expenses nikdy neukládá částku jako desetinné číslo.
Nejmenší jednotka jako celé číslo
Trik, který finanční software používá odjakživa: počítat v nejmenší jednotce a držet ji jako celé číslo. Místo 4,20 Kč
uložíte 420 – počet haléřů. Celá čísla jsou přesná. Sčítejte, odčítejte a dělejte součty celý den a žádný zaokrouhlovací
prach se nenahromadí.
Boring Expenses jde ještě o krok dál a ukládá částky ve velmi jemných podjednotkách (představte si „100 milionů na jednotku“),
což nechává spoustu prostoru pro různé měny i budoucí potřeby a přitom všechno zůstává obyčejným Int. Převod na to, co
vidíte na obrazovce, probíhá jen na okrajích – když částku zadáváte a když ji formátujeme k zobrazení.
// Ilustrace, ne přesný kód:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Proč na tom záleží vám
- Součty jsou přesné. Měsíční součet je skutečný součet, ne číslo, které se s rostoucím seznamem posouvá o halíř.
- Synchronizace je konzistentní. Celé číslo znamená totéž na iPhonu, Watch i iPadu. Není co dorovnávat.
- Exporty jsou spolehlivé. Exportovaný CSV sedí s aplikací na halíř.
Je to malé, nenápadné rozhodnutí – přesně takové, jaká máme rádi. Nikdy ho neuvidíte, a o to jde: čísla prostě sedí.