Der Phantom-Penny
Jeder, der einen mehrjährigen ASC 606 Zeitplan in Excel, in einem ERP wie NetSuite Advanced Revenue Management (ARM) oder Workday oder mit einem eigenen Skript gerechnet hat, kennt das: Ein Vertrag über $1,000,000.00 mit 36 Monaten realisiert $1,000,000.08 oder $999,999.72, je nachdem, ob jeder Monat kaufmännisch auf- oder abgerundet wird.
Ein paar Cent sind keine Falschdarstellung. Sie sind aber ein Ärgernis mit Folgekosten:
- Der Zeitplan stimmt nicht mit dem Vertragswert überein.
- Der abgegrenzte Saldo erreicht nie null, sodass jemand eine Ausgleichsbuchung vornimmt.
- Jede Ausgleichsbuchung ist ein Abstimmungsposten, den man dem Prüfer und dem Abschlussprüfer erklären muss.
- Wiederkehrende manuelle Korrekturen laden zu Fragen zu den Kontrollen rund um den Zeitplan ein.
Was bewirkt Gleitkomma und was nicht?
Die meiste Software speichert Zahlen im binären Gleitkommaformat, und Dezimalbrüche wie 0.10 haben keine exakte binäre Darstellung. Dieser Darstellungsfehler liegt bei etwa einem Teil in 10^16 und ist viel zu klein, um einen auf den Cent gerundeten Betrag zu verändern. Die Cent entstehen dadurch, dass jede Periode für sich gerundet wird:
// Rounding each month to the cent
const contractTotal = 100000.00;
const periods = 36;
const monthly = contractTotal / periods; // 2777.777...
let sum = 0;
for (let i = 0; i < 36; i++) {
sum += Number(monthly.toFixed(2)); // 2777.78 every month
}
console.log(sum.toFixed(2)); // "100000.08": eight cents over
Dezimalarithmetik liefert dieselben acht Cent. Die Lösung ist eine Regel für den Rest, nicht allein ein anderer Zahlentyp.
Wie summieren sich Rundungen bei Verträgen mit mehreren Elementen?
Nehmen Sie einen Vertrag mit:
- Plattform-Abonnement ($120,000 über 12 Monate)
- Implementierungsleistungen ($35,000, meilensteinbasiert)
- Premium-Support ($15,000 über 12 Monate)
- Upsell während der Laufzeit ($25,000, zeitanteilig)
Die Aufteilung nach relativem SSP teilt den Transaktionspreis nach dem Anteil jeder Verpflichtung auf: Aufteilung auf Verpflichtung i = Transaktionspreis × SSP von i ÷ Summe aller SSP. Wird jede Aufteilung vor der Zeitplanung für sich auf den Cent gerundet, können die Aufteilungen schon vor der Buchung des ersten Monats um einen Cent vom Transaktionspreis abweichen. Dann teilt jeder Zeitplan erneut. Der Leitfaden zum Rest-Cent rechnet ein Beispiel mit drei Verpflichtungen durch.
Ganzzahlarithmetik mit Restregel
Soluqube rechnet in Ganzzahlarithmetik (BigInt) mit Skalierung 10^6, auf Cent gerundet, mit Aufnahme des Rests in der letzten Periode:
- Ganzzahlige Beträge: Werte werden mit 1,000,000 skaliert und ausschließlich mit Ganzzahlarithmetik berechnet (JavaScript
BigInt). - Den Rest behalten: Bei jeder Division P / N werden Quotient Q und Rest R behalten, sodass P = N × Q + R gilt.
- Den Rest zuweisen: Die letzte Periode jeder Verpflichtung nimmt R auf.
// Amounts in cents; the final period absorbs the remainder
export function buildSchedule(totalCents: bigint, periods: bigint): bigint[] {
const base = totalCents / periods;
const remainder = totalCents % periods;
const schedule: bigint[] = [];
for (let i = 0n; i < periods; i++) {
schedule.push(i === periods - 1n ? base + remainder : base);
}
return schedule; // sums to totalCents exactly
}
Probieren Sie andere Vertragswerte und Laufzeiten im Zeitplan-Simulator aus.
Was ändert sich bei der Prüfung?
- Zeitpläne, die stimmen: Aufteilungen und alle Perioden ergeben in Summe den Transaktionspreis, und jede Verpflichtung endet mit einem abgegrenzten Saldo von $0.00.
- Weniger Ausgleichsbuchungen zu erklären: keine Rundungskorrekturen zum Monatsende bei diesen Verträgen.
- Nachrechenbares Ergebnis: Dieselben Inputs liefern dieselben Cent, und der Export enthält SHA-256-Hashes mit einer Merkle-Wurzel, damit ein Prüfer bestätigen kann, dass er unverändert ist.
Die Cent sind der einfache Teil; Abschlussprüfer verbringen ihre Zeit mit dem SSP hinter der Aufteilung. Für eine Betrachtung System für System siehe NetSuite ARM vs Soluqube und den ASC 606 Hub, oder bringen Sie drei Verträge in das Design-Partner-Programm.