Blog

Hogyan tárolja a Boring Expenses a pénzt (és miért egész számként)

  • mérnöki munka
  • iOS
  • Swift

Van egy klasszikus módja annak, hogy elveszíts egy fillért. Kérdezd meg szinte bármelyik programozási nyelvet, mennyi 0.1 + 0.2, és azt feleli: 0.30000000000000004. Ez nem a nyelv hibája – így működnek a bináris lebegőpontos számok. A legtöbb tizedes törtet nem tudják pontosan ábrázolni, így apró hibák csúsznak be. Fizikához rendben van; pénzhez nem.

Egy pénzügyi appnál a „nagyjából jó” rossz válasz. Ezért a Boring Expenses soha nem tárol összeget tizedes törtként.

A legkisebb egység egész számként

A trükk, amelyet a pénzügyi szoftverek mindig is használtak: a legkisebb egységben számolni, és egész számként tartani. A 4,20 € helyett 420-at tárolsz – a centek számát. Az egész számok pontosak. Egész nap adhatsz össze, vonhatsz ki és összegezhetsz, kerekítési por soha nem gyűlik össze.

A Boring Expenses egy lépéssel tovább megy, és nagyon finom alegységekben tárolja az összegeket (gondolj „egységenként 100 millióra”), ami bőven hagy helyet a különböző pénznemeknek és a jövőbeli igényeknek, miközben minden egyszerű Int marad. A képernyőn látott értékre való átváltás csak a széleken történik – amikor beírsz egy összeget, és amikor megjelenítéshez formázzuk.

// Szemléltetés, nem a pontos kód:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))

Miért számít ez neked

Ez egy kicsi, feltűnésmentes döntés – pont az a fajta, amit szeretünk. Soha nem fogod látni, és ez a lényeg: a számok egyszerűen stimmelnek.