Blog

Com desa els diners Boring Expenses (i per què és un enter)

  • enginyeria
  • iOS
  • Swift

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

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