解决JavaScript精度误差应选用专用高精度库:金融场景首选decimal.js,通用计算选bignumber.js,极简需求可用big.js,复杂公式解析则用mathjs。

JavaScript 的 Number 类型基于 IEEE 754 双精度浮点数,天生无法精确表示很多十进制小数(比如 0.1 + 0.2 === 0.30000000000000004)。要真正解决精度误差,不能靠四舍五入或字符串截断这类“表面修复”,而应选用专为高精度十进制运算设计的库。选哪个,关键看你的场景需求。
金融/金额类业务:优先用 decimal.js
decimal.js 是专为财务计算打磨的轻量级库,API 简洁、默认行为稳健,支持任意精度设置和多种舍入模式。它不追求全能,但把加减乘除、比较、格式化这些核心操作做得非常可靠。
- 适合处理价格、余额、税率等必须“分”级准确的场景
- 体积小(约 20KB minified),无外部依赖,加载快
- 默认构造时保留原始字符串精度,不会自动丢位或四舍五入
- 示例:
new Decimal('19.99').plus('0.01').toString() // '20.00'
通用高精度计算:bignumber.js 更灵活
bignumber.js 功能更全,支持科学计数法、幂运算、三角函数、自定义进制,也允许精细控制精度和舍入方式。适合对数值行为有明确要求的中大型项目。
- 内部用字符串存储,完全避开浮点误差源头
- 可配置全局精度(
BigNumber.config({ precision: 20 })),也可在单次运算中覆盖 - 兼容 Node 和浏览器,生态成熟,文档详尽
- 注意:比 decimal.js 略重(约 35KB),API 有一定学习成本
极简需求或已有 big.js 项目:big.js 是轻量替代
如果你只需要基础四则运算,且对包体积极其敏感(如嵌入式前端、微前端子应用),big.js 是个务实选择。它和 bignumber.js 同源,API 高度相似,但砍掉了非必要功能。
立即学习“Java免费学习笔记(深入)”;
- 体积仅约 8KB,性能好
- 不支持开方、对数、三角函数等扩展运算
- 精度固定为 20 位(不可配置),适合标准化程度高的小规模计算
复杂公式或符号计算:mathjs 作为补充方案
mathjs 不是纯精度库,而是带高精度后端的数学表达式引擎。当你需要解析动态公式(如用户输入的 "0.1 + 0.2 * (3 - 1)")、混合单位运算或符号推导时,它才真正体现价值。
- 底层可切换 decimal.js 或 bignumber.js 作为数值引擎
- 体积较大(约 150KB+),不建议只为精度问题引入
- 适合数据分析工具、计算器类应用,而非普通表单校验


















