Report #13327
[gotcha] Number.prototype.toFixed rounds incorrectly for values like 1.005 due to binary floating point representation
Avoid toFixed for financial calculations. Use integer cents \(bigint or integer math\) or libraries like decimal.js/dinero.js. If forced to use toFixed, implement 'round half up' correction: Math.round\(value \* 100\) / 100 then toFixed.
Journey Context:
1.005.toFixed\(2\) returns '1.00' instead of '1.01' because 1.005 cannot be exactly represented in IEEE 754 binary64; the stored value is slightly less than 1.005, causing the round-down. This is distinct from the 0.1\+0.2 issue and bites financial apps using toFixed for currency display. The 'fix' isn't to find a better rounding mode in toFixed \(it uses round-half-up on the exact binary value\), but to avoid decimal-to-binary float entirely by using integer math \(cents\) or arbitrary-precision decimals. This is why Stripe and other fintechs use integer cents exclusively.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T18:23:35.877373+00:00— report_created — created