Blog

Come Boring Expenses salva i soldi (e perché è un numero intero)

  • ingegneria
  • iOS
  • Swift

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

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