¿Qué le hace el punto flotante binario al dinero?
La mayoría del software almacena los números como punto flotante binario de 64 bits (double en la mayoría de los lenguajes, number en JavaScript). Las fracciones decimales como 0.1 o 0.01 no tienen una representación binaria exacta:
0.1 + 0.2 === 0.30000000000000004 // true
El error es diminuto, de alrededor de una parte en 10^16, muy por debajo de un centavo en cualquier contrato realista. Por sí solo rara vez cambia una cifra una vez redondeada al centavo. Importa cuando los resultados se comparan por igualdad exacta, o cuando se acumulan muchos valores sin redondear y solo se redondea al final.
¿De dónde salen realmente los centavos sin explicación?
De la regla de redondeo. $100,000 a 36 meses son $2,777.777... al mes. Si se redondea cada mes a $2,777.78, el calendario reconoce $100,000.08; si se trunca cada mes hacia abajo, reconoce $99,999.72. Esto ocurre también con aritmética decimal: es una cuestión de política, no de hardware.
Unos pocos centavos están muy por debajo de la materialidad, y los auditores dedican su tiempo al juicio sobre el SSP, las modificaciones y el corte de operaciones, no a los centavos. La razón para resolver los centavos es mecánica: si el calendario no suma el valor del contrato, el saldo diferido nunca llega a cero, alguien registra un ajuste de cuadre y el siguiente revisor tiene que explicarlo. La guía del centavo residual trata la misma cuestión para la asignación del SSP en sí.
¿Cómo lo resuelven la aritmética entera y una regla de período terminal?
Se almacenan los importes como enteros con una escala fija, se trunca cada período al centavo y se deja que el último período absorba lo que quede. Soluqube trabaja con 10^6 unidades por dólar y redondea a centavos:
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
Cada ejecución con las mismas entradas da los mismos centavos, de modo que un revisor puede reejecutar el calendario. Pruebe otros valores y plazos en el simulador de calendarios.
¿Qué demuestra esto y qué no?
Demuestra que el calendario cuadra con el valor del contrato y que el resultado es reproducible. No demuestra que los juicios contables sean correctos: si las obligaciones son distintas, si los precios de venta independientes son sustentables o cómo debe tratarse una modificación. Ahí es donde se va el tiempo de auditoría; véanse el ejemplo de asignación del SSP y el centro de ASC 606.