Blog

Comment Boring Expenses stocke l’argent (et pourquoi c’est un entier)

  • technique
  • iOS
  • Swift

Voici une façon classique de perdre un centime. Demandez à presque n’importe quel langage de programmation combien font 0.1 + 0.2, et il vous répondra 0.30000000000000004. Ce n’est pas un bug du langage : c’est le fonctionnement des nombres binaires à virgule flottante. Ils ne savent pas représenter exactement la plupart des fractions décimales, alors de minuscules erreurs s’y glissent. Très bien pour la physique ; pas pour l’argent.

Pour une app financière, « à peu près juste » est la mauvaise réponse. Boring Expenses ne stocke donc jamais un montant sous forme décimale.

Stocker la plus petite unité sous forme d’entier

L’astuce qu’utilisent les logiciels financiers depuis toujours : calculer dans la plus petite unité et la garder sous forme d’entier. Au lieu de 4,20 €, on stocke 420 — le nombre de centimes. Les entiers sont exacts. Additionnez, soustrayez, faites des totaux toute la journée, et aucune poussière d’arrondi ne s’accumule.

Boring Expenses va un cran plus loin et stocke les montants dans des sous-unités très fines (imaginez « 100 millions par unité »), ce qui laisse une large marge pour les devises et les besoins futurs tout en gardant tout en simple Int. La conversion vers ce que vous voyez à l’écran n’a lieu qu’aux extrémités — quand vous tapez un montant, et quand nous le mettons en forme pour l’afficher.

// Illustration, pas le code exact :
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Pourquoi c’est important pour vous

C’est une petite décision, sans éclat — exactement le genre qu’on aime. Vous ne la verrez jamais, et c’est tout l’intérêt : les chiffres tombent juste.