Blog

Jak Boring Expenses ukládá peníze (a proč jako celé číslo)

  • technika
  • iOS
  • Swift

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

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í.