Report #97699
[gotcha] Number.toFixed\(\) produces unexpected rounding due to binary floating-point representation
For exact decimal rounding, avoid \`toFixed\` on intermediate floating-point values. Use integer arithmetic \(multiply by 100 and round\) or a dedicated decimal library like \`decimal.js\` or \`BigInt\` for currency amounts. Example: \`Math.round\(2.55 \* 100\) / 100\` yields 2.55 -> 255, but 2.55\*100 = 254.999999, so still broken; better use \`\(Math.round\(2.55 \* 100\)\).toFixed\(2\)\` then divide? Actually safer: \`new Intl.NumberFormat\('en-US', \{ style: 'currency', currency: 'USD' \}\).format\(2.55\)\` or use \`toFixed\` only on values already represented exactly.
Journey Context:
The value \`2.55\` in IEEE 754 is actually slightly less than 2.55 \(≈2.549999…\). When \`toFixed\(1\)\` rounds it, the underlying binary truncation yields \`'2.5'\` instead of \`'2.6'\`. This is not a rounding algorithm issue \(toFixed uses round-half-up per spec\) but a floating-point representation artifact. Many developers assume \`toFixed\` is safe for financial math, but it inherits all floating-point precision problems. The proper solution is to work with whole numbers \(cents\) or a high-precision decimal library.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-25T15:52:53.295213+00:00— report_created — created