javascript高级编程系列 - decimal.js 数字精度处理函数库
安装
Decimal.js 是一个用于 JavaScript 的任意精度十进制算术库,可以解决 JavaScript 浮点数精度问题。
通过 npm 安装
npm install decimal.js
通过 CDN 引入
<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/10.4.3/decimal.min.js"></script>
通过 ES6 模块导入
import Decimal from 'decimal.js';
基本使用
创建 Decimal 对象
const a = new Decimal(0.1);
const b = new Decimal('0.2');
const c = Decimal(0.3); // 也可以不用 new
基本运算
const sum = a.plus(b); // 0.1 + 0.2 = 0.3 (精确)
const diff = a.minus(b);
const product = a.times(b);
const quotient = a.dividedBy(b);
比较操作
Decimal(0.1).plus(0.2).equals(0.3); // true
Decimal(0.1).greaterThan(0.2); // false
Decimal(0.1).lessThanOrEqualTo(0.2); // true
其他操作
// 取整
Decimal('123.456').toNearest(1); // '123'
Decimal('123.456').toNearest(0.1); // '123.5'
// 平方根
Decimal(16).sqrt(); // '4'
// 幂运算
Decimal(2).pow(3); // '8'
// 取模
Decimal(10).mod(3); // '1'
配置全局设置
Decimal.set({
precision: 20, // 设置全局精度
rounding: Decimal.ROUND_HALF_UP, // 设置舍入模式
toExpNeg: -7, // 负指数界限
toExpPos: 21 // 正指数界限
});
设计原理
-
任意精度实现:
- 使用字符串或数组存储数字,避免 JavaScript 浮点数精度限制
- 所有运算都在内部转换为整数运算,最后再调整小数位
-
数字表示:
- 将数字表示为系数和指数的组合(类似科学计数法)
- 例如:123.45 表示为
-
运算算法:
- 加/减法:对齐小数点后直接运算
- 乘法:使用长乘法算法
- 除法:使用长除法算法,可选择不同精度
- 复杂函数(如三角函数、对数)使用泰勒级数或其他近似算法
-
舍入处理:
- 提供多种舍入模式(ROUND_UP, ROUND_DOWN, ROUND_CEIL, ROUND_FLOOR, ROUND_HALF_UP 等)
- 所有运算都按照配置的精度和舍入模式处理结果
-
错误处理:
- 对无效操作(如除以零)返回特定的错误值(如 Infinity, NaN)
- 提供配置选项控制是否抛出异常
-
性能优化:
- 使用优化的算法处理大数运算
- 对于常见情况有特殊处理路径
- 避免不必要的内存分配
-
扩展性:
- 允许通过配置修改全局行为
- 可以扩展 Decimal 类添加自定义方法
适用场景
- 金融计算(货币、利率、税务等)
- 科学计算需要高精度时
- 任何需要避免 JavaScript 浮点数精度问题的场景
- 需要精确小数运算的业务逻辑
注意事项
- Decimal.js 对象是不可变的,所有操作都返回新对象
- 性能比原生运算慢,只在需要精度时使用
- 大数运算会消耗更多内存
- 需要根据业务需求合理设置精度
Decimal.js 提供了一种可靠的方式来解决 JavaScript 的浮点数精度问题,特别适合于需要精确十进制计算的场景。