Decimal.js 完全指南:解决前端数值精度痛点的核心方案
Decimal.js 完全指南:解决前端数值精度痛点的核心方案
- 一、简介
- 二、安装
- 三、原生精确度与Decimal对比
- 四、静态方法-普通运算
- 五、静态方法-科学计算
- 六、静态方法-三角函数(参数为弧度)
- 七、静态方法-双曲函数(参数为弧度)
- 八、静态方法-工具方法
- 九、静态属性,可使用Decimal.set() 设置属性
- 十、实例方法-普通运算
- 十一、实例方法-科学计算
- 十二、实例方法-三角函数(实例值为弧度)
- 十三、实例方法-双曲函数(实例值为弧度)
- 十四、实例方法-比较 / 判断
- 十五、实例方法-格式转换
- 十六、实例属性
夸克资源分享:
表情包:https://pan.quark.cn/s/5b9ddeb237fe
工具箱:https://pan.quark.cn/s/aa2d6a730482,图吧、美蛋、路遥、入梦等
Fiddler Everywhere抓包:https://pan.quark.cn/s/6b1e2fbae019,
Adobe:https://pan.quark.cn/s/13e39cfeaadb,先看安装教程
JetBranis开发者工具:https://pan.quark.cn/s/16e94dcff1f7,先看安装教程下的jetbra教程
逆向工具:https://pan.quark.cn/s/50e93c8ca54c
数据库工具:https://pan.quark.cn/s/2f14eda13d24
kettle:https://pan.quark.cn/s/62f320634c75
前端项目搭建集锦:https://blog.ZEEKLOG.net/randy521520/article/details/146998467
前端接单》前端接单 》前端接单:https://www.goofish.com/item?id=1008883794643
一、简介
Decimal 是为解决原生 Number 类型精度缺陷而生的高精度数值处理方案。前端原生 Number 遵循 IEEE 754 双精度浮点数标准,无法精确表示 0.1、0.2 等十进制小数,导致 0.1+0.2=0.30000000000000004 这类精度偏差,这在高精度敏感场景中是不可接受的,Decimal 由此成为核心解决方案。
需要注意的是,前端无内置 Decimal 类型,需依赖第三方库实现,主流选择包括功能全面的 decimal.js、轻量简洁的 bignumber.js 以及轻量化的 decimal.js-light。使用时需先通过 npm 或 yarn 安装,初始化实例时推荐传入字符串格式的数值(避免原生 Number 提前丢失精度),再通过库提供的方法完成高精度运算,运算后可通过 toString、toFixed 等方法实现格式转换与格式化。
Decimal 的核心优势在于以十进制存储数值,彻底规避二进制转换带来的精度偏差,且实例具有不可变性,运算后返回新实例,保证数据安全。其典型应用场景集中在金融财务(金额计算、转账结算)、税务计算(税率换算、应纳税额统计)等对精度要求极高的领域。使用时需注意避免入参为原生不精确 Number、避免混合类型运算,按需选择合适的库即可满足各类高精度需求。
官网地址:https://mikemcl.github.io/decimal.js/
二、安装
yarn install decimal.js 三、原生精确度与Decimal对比
1.四则运算、取余精确度差异

import Decimal from'decimal.js'; console.log('==============加法==============');const nativeAdd =0.1+0.2;const decimalAdd1 = Decimal.add('0.1','0.2');// 静态方法const decimalAdd2 =newDecimal('0.1').plus('0.2');// 实例方法(plus 对应加法) console.log('原生 JS 结果:', nativeAdd);// 输出:0.30000000000000004(错误) console.log('Decimal 静态方法结果:', decimalAdd1.toString());// 输出:"0.3"(正确) console.log('Decimal 实例方法结果:', decimalAdd2.toString());// 输出:"0.3"(正确) console.log('\n==============减法==============');const nativeSub =1.0-0.9;const decimalSub1 = Decimal.sub('1.0','0.9');const decimalSub2 =newDecimal('1.0').sub('0.9'); console.log('原生 JS 结果:', nativeSub);// 输出:0.09999999999999998(错误) console.log('Decimal 静态方法结果:', decimalSub1.toString());// 输出:"0.1"(正确) console.log('Decimal 实例方法结果:', decimalSub2.toString());// 输出:"0.1"(正确) console.log('\n==============乘法==============');const nativeMul =0.07*100;const decimalMul1 = Decimal.mul(0.07,100);const decimalMul2 =newDecimal(0.07).mul(100); console.log('原生 JS 结果:', nativeMul);// 输出:7.000000000000001(错误) console.log('Decimal 静态方法结果:', decimalMul1.toNumber());// 输出:7(正确) console.log('Decimal 实例方法结果:', decimalMul2.toNumber());// 输出:7(正确) console.log('\n==============除法==============');const nativeDiv