Blog
Come Boring Expenses salva i soldi (e perché è un numero intero)
C’è un modo classico per perdere un centesimo. Chiedi a quasi qualsiasi linguaggio di programmazione quanto fa 0.1 + 0.2
e ti risponderà 0.30000000000000004. Non è un bug del linguaggio: è così che funzionano i numeri binari in virgola mobile.
Non riescono a rappresentare esattamente la maggior parte delle frazioni decimali, quindi si infilano piccoli errori. Va
bene per la fisica; non per i soldi.
Per un’app di finanza, «più o meno giusto» è la risposta sbagliata. Per questo Boring Expenses non salva mai un importo come numero decimale.
Salvare l’unità più piccola come numero intero
Il trucco che il software finanziario usa da sempre è lavorare nell’unità più piccola e tenerla come intero. Invece di
4,20 € salvi 420, il numero di centesimi. Gli interi sono esatti. Somma, sottrai e fai totali tutto il giorno, e non si
accumula mai polvere di arrotondamento.
Boring Expenses fa un passo in più e salva gli importi in sottounità molto fini (pensa a «100 milioni per unità»), lasciando
ampio margine per valute diverse ed esigenze future pur mantenendo tutto come un semplice Int. La conversione in ciò che
vedi sullo schermo avviene solo ai bordi: quando digiti un importo e quando lo formattiamo per mostrarlo.
// Illustrazione, non il codice esatto:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Perché ti riguarda
- I totali sono esatti. Il totale del mese è il totale vero, non un numero che slitta di un centesimo man mano che l’elenco cresce.
- La sincronizzazione resta coerente. Un intero significa la stessa cosa su iPhone, Watch e iPad. Non c’è ambiguità da riconciliare.
- Le esportazioni sono affidabili. Il CSV che esporti corrisponde all’app al centesimo.
È una decisione piccola e senza clamore, esattamente il tipo che ci piace. Non la vedrai mai, ed è proprio questo il punto: i numeri tornano e basta.