1.2 KiB
Incident 2026-09-24: order totals off by one cent
Root cause
C-2 — the totals refactor in src/totals.js.
The refactor replaced integer-cent arithmetic with a decimal discount factor
(priceCents * quantity * (1 - discountPercent / 100)). Decimal factors such
as 0.7 or 0.93 have no exact binary floating-point representation, so for
line amounts whose exact discounted value lands precisely on a half-cent
boundary (e.g. 165 cents at 30% off = 115.5), the float result lands just
below the boundary and Math.round rounds down instead of half-up. Every
affected order is undercharged by exactly one cent, matching the finance
findings in evidence/incident.txt.
Evidence
evidence/incident.txt: every flagged order is off by exactly one cent in the store's favor, and all of them appeared after the 2026-09-23 deploy.- C-1 (logging) and C-3 (inventory timeout) cannot change totals; C-2 touched the totals computation itself.
Fix
src/totals.js now computes line discounts with exact integer arithmetic:
floor((priceCents * quantity * (100 - discountPercent) + 50) / 100), which
rounds half-up on exact cent boundaries with no floating-point error.