Was macht binäre Gleitkommadarstellung mit Geldbeträgen?
Die meiste Software speichert Zahlen als binäre 64-Bit-Gleitkommazahlen (double in den meisten Sprachen, number in JavaScript). Dezimalbrüche wie 0.1 oder 0.01 haben keine exakte binäre Darstellung:
0.1 + 0.2 === 0.30000000000000004 // true
Der Fehler ist winzig, etwa ein Teil in 10^16, und liegt bei jedem realistischen Vertrag weit unter einem Cent. Für sich genommen ändert er einen Betrag nach dem Runden auf den Cent selten. Relevant wird er, wenn Ergebnisse auf exakte Gleichheit verglichen werden oder wenn viele ungerundete Werte aufsummiert und erst am Ende gerundet werden.
Woher kommen die unerklärten Cent wirklich?
Aus der Rundungsregel. $100,000 über 36 Monate sind $2,777.777... pro Monat. Rundet man jeden Monat auf $2,777.78, realisiert der Zeitplan $100,000.08; rundet man jeden Monat ab, sind es $99,999.72. Das passiert auch mit Dezimalarithmetik: Es ist eine Frage der Methodik, nicht der Hardware.
Ein paar Cent liegen weit unter der Wesentlichkeitsgrenze, und Abschlussprüfer widmen ihre Zeit der SSP-Beurteilung, Vertragsänderungen und der Periodenabgrenzung (Cutoff) statt Pfennigbeträgen. Der Grund, die Cent zu klären, ist mechanisch: Wenn der Zeitplan nicht zum Vertrag aufgeht, erreicht die passive Rechnungsabgrenzung nie null, jemand bucht eine Ausgleichsbuchung, und der nächste Prüfer muss sie erklären. Der residual-cent guide behandelt dieselbe Frage für die SSP-Aufteilung selbst.
Wie beheben Ganzzahlarithmetik und eine Regel für die letzte Periode das?
Speichern Sie Beträge als Ganzzahlen mit fester Skala, runden Sie jede Periode auf den Cent ab und lassen Sie die letzte Periode aufnehmen, was übrig bleibt. Soluqube arbeitet mit 10^6 Einheiten pro Dollar und rundet auf Cent:
const SCALE = 1_000_000n; // 10^6 units per dollar
const CENT = SCALE / 100n;
const total = 100_000n * SCALE; // $100,000.00
const months = 36n;
const monthly = (total / months / CENT) * CENT; // floor to the cent: $2,777.77
const last = total - monthly * (months - 1n); // final month: $2,778.05
// 35 x $2,777.77 + $2,778.05 = $100,000.00
Jeder Lauf mit denselben Eingaben liefert dieselben Cent, sodass ein Prüfer den Zeitplan nachrechnen kann. Probieren Sie andere Werte und Laufzeiten im schedule simulator aus.
Was belegt das, und was nicht?
Es belegt, dass der Zeitplan zum Vertragswert passt und das Ergebnis reproduzierbar ist. Es belegt nicht, dass die bilanziellen Beurteilungen richtig sind: ob die Verpflichtungen eigenständig abgrenzbar sind, ob die Einzelveräußerungspreise belastbar sind oder wie eine Vertragsänderung zu behandeln ist. Dort fließt die Prüfungszeit hin; siehe das SSP allocation example und den ASC 606 hub.