Report #4192
[gotcha] IEEE 754 floating point cannot exactly represent decimal fractions, causing money calculation errors
Store monetary values as integer cents \(smallest currency unit\) using BigInt for large sums \(>9 quadrillion cents\), or use a decimal library like dinero.js; never use .toFixed\(\) for rounding before calculations—only for final display
Journey Context:
JavaScript Numbers are IEEE 754 doubles, which cannot precisely represent values like 0.1 or 0.01. Operations like 0.1 \+ 0.2 === 0.3 return false. For financial calculations, this compounds into cents-off errors. The common mistake is using toFixed\(2\) to 'fix' the number, but that returns a string and doesn't solve intermediate calculation precision. The robust pattern is integer math: store $10.50 as 1050 \(cents\). For larger values or currencies with 3 decimals, use BigInt to avoid 53-bit integer limits \(Number.MAX\_SAFE\_INTEGER is ~9 quadrillion cents\). Libraries like dinero.js or decimal.js abstract this but add bundle size.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T18:58:29.162014+00:00— report_created — created