Blog
Com desa els diners Boring Expenses (i per què és un enter)
Hi ha una manera clàssica de perdre un cèntim. Pregunta a gairebé qualsevol llenguatge de programació quant fa 0.1 + 0.2 i
et dirà 0.30000000000000004. No és un error del llenguatge: és com funcionen els nombres binaris de coma flotant. No poden
representar exactament la majoria de fraccions decimals, i s’hi colen petits errors. Per a la física ja va bé; per als
diners, no.
En una app de finances, «gairebé exacte» és la resposta equivocada. Per això Boring Expenses no desa mai un import com a nombre decimal.
Desar la unitat més petita com a enter
El truc que el programari de diners fa servir des de sempre és treballar amb la unitat més petita i guardar-la com a enter.
En lloc de 4,20 €, desa 420, el nombre de cèntims. Els enters són exactes. Suma, resta i fes totals tot el dia i no
s’acumularà mai pols d’arrodoniment.
Boring Expenses va un pas més enllà i desa els imports en subunitats molt fines (pensa en «100 milions per unitat»), cosa
que deixa molt de marge per a diferents monedes i necessitats futures sense deixar de guardar-ho tot com un simple Int. La
conversió al que veus a la pantalla només passa als extrems: quan escrius un import i quan li donem format per mostrar-lo.
// Il·lustració, no el codi exacte:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Per què t’importa
- Els totals són exactes. El total del mes és el total real, no un número que es desvia un cèntim a mesura que la llista creix.
- La sincronització és coherent. Un enter vol dir el mateix a l’iPhone, al Watch i a l’iPad. No hi ha cap ambigüitat per conciliar.
- Les exportacions són fiables. El CSV que exportes coincideix amb l’app fins al cèntim.
És una decisió petita i gens vistosa, just del tipus que ens agrada. No la veuràs mai, i aquesta és la idea: els números simplement quadren.