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 // 正指数界限
});

设计原理

  1. 任意精度实现

    • 使用字符串或数组存储数字,避免 JavaScript 浮点数精度限制
    • 所有运算都在内部转换为整数运算,最后再调整小数位
  2. 数字表示

    • 将数字表示为系数和指数的组合(类似科学计数法)
    • 例如:123.45 表示为
  3. 运算算法

    • 加/减法:对齐小数点后直接运算
    • 乘法:使用长乘法算法
    • 除法:使用长除法算法,可选择不同精度
    • 复杂函数(如三角函数、对数)使用泰勒级数或其他近似算法
  4. 舍入处理

    • 提供多种舍入模式(ROUND_UP, ROUND_DOWN, ROUND_CEIL, ROUND_FLOOR, ROUND_HALF_UP 等)
    • 所有运算都按照配置的精度和舍入模式处理结果
  5. 错误处理

    • 对无效操作(如除以零)返回特定的错误值(如 Infinity, NaN)
    • 提供配置选项控制是否抛出异常
  6. 性能优化

    • 使用优化的算法处理大数运算
    • 对于常见情况有特殊处理路径
    • 避免不必要的内存分配
  7. 扩展性

    • 允许通过配置修改全局行为
    • 可以扩展 Decimal 类添加自定义方法

适用场景

  1. 金融计算(货币、利率、税务等)
  2. 科学计算需要高精度时
  3. 任何需要避免 JavaScript 浮点数精度问题的场景
  4. 需要精确小数运算的业务逻辑

注意事项

  1. Decimal.js 对象是不可变的,所有操作都返回新对象
  2. 性能比原生运算慢,只在需要精度时使用
  3. 大数运算会消耗更多内存
  4. 需要根据业务需求合理设置精度

Decimal.js 提供了一种可靠的方式来解决 JavaScript 的浮点数精度问题,特别适合于需要精确十进制计算的场景。

posted @ 2025-06-16 17:57  箫笛  阅读(903)  评论(0)    收藏  举报