Blog
Wie Boring Expenses Geld speichert (und warum als Ganzzahl)
Hier ist ein klassischer Weg, einen Cent zu verlieren. Frag fast jede Programmiersprache, was 0.1 + 0.2 ergibt, und
sie antwortet 0.30000000000000004. Das ist kein Fehler der Sprache – so funktionieren binäre Gleitkommazahlen. Sie
können die meisten Dezimalbrüche nicht exakt darstellen, also schleichen sich winzige Fehler ein. Für Physik in Ordnung,
für Geld nicht.
Für eine Finanz-App ist „ungefähr richtig“ die falsche Antwort. Deshalb speichert Boring Expenses einen Betrag nie als Dezimalzahl.
Die kleinste Einheit als ganze Zahl speichern
Der Trick, den Finanzsoftware seit jeher nutzt: in der kleinsten Einheit rechnen und sie als Ganzzahl halten. Statt
4,20 € speicherst du 420 – die Anzahl der Cent. Ganzzahlen sind exakt. Addieren, subtrahieren und summieren den
ganzen Tag, und es sammelt sich nie Rundungsstaub an.
Boring Expenses geht noch einen Schritt weiter und speichert Beträge in sehr feinen Untereinheiten (denk an „100
Millionen pro ganzer Einheit“). Das lässt viel Spielraum für Währungen und künftige Anforderungen und hält trotzdem alles
als schlichtes Int. Die Umrechnung in das, was du auf dem Bildschirm siehst, passiert ganz am Rand – wenn du einen
Betrag eintippst und wenn wir ihn zur Anzeige formatieren.
// Zur Veranschaulichung, nicht der exakte Code:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
Warum das für dich zählt
- Summen sind exakt. Deine Monatssumme ist die echte Summe, keine Zahl, die mit wachsender Liste um einen Cent abdriftet.
- Die Synchronisierung bleibt konsistent. Eine Ganzzahl bedeutet auf iPhone, Watch und iPad dasselbe. Es gibt nichts Mehrdeutiges abzugleichen.
- Exporte sind verlässlich. Die exportierte CSV stimmt mit der App auf den Cent überein.
Es ist eine kleine, unspektakuläre Entscheidung – genau die Sorte, die wir mögen. Du wirst sie nie sehen, und das ist der Punkt: Die Zahlen gehen einfach auf.