decimal.js JavaScript 十进制计算

decimal.js 实现了对任意精度的十进制进行计算的 JavaScript 库。

decimal.js 是一个用于解决 JavaScript 浮点数精度问题的开源库,它通过实现任意精度的十进制算术运算,确保了计算结果的准确性。下面这个表格汇总了它的核心信息。

特性维度描述
​核心价值​解决 JavaScript 浮点数计算精度问题(如 0.1 + 0.2 !== 0.3)并进行大数运算。
​精度类型​任意精度计算,有效数字位数可配置,不受 IEEE 754 双精度浮点数格式(约15位有效数字)限制。
​功能范围​支持加减乘除、幂运算、开方、三角函数等;支持二进制、八进制、十六进制数值处理。
​编程支持​支持链式调用;提供 TypeScript 类型定义文件。
​适用场景​金融计算、科学计算、工程计算、数据可视化等对精度要求高的领域。

💡 如何使用

安装与引入

你可以通过 npm 安装或直接在浏览器中通过 CDN 引入该库。

npm install decimal.js

在代码中引入并使用:

// 在Node.js或支持ES Module的现代环境中
import Decimal from 'decimal.js';
// 或者
const Decimal = require('decimal.js');

// 在浏览器环境中通过CDN使用
// <script src="https://cdn.jsdelivr.net/npm/decimal.js@10.4.3/decimal.min.js"></script>

// 创建Decimal对象(推荐使用字符串初始化以避免初始精度损失)
const a = new Decimal('0.1');
const b = new Decimal('0.2');

// 进行加法运算
const sum = a.plus(b);
console.log(sum.toString()); // 输出 '0.3'

基本运算

decimal.js 提供了丰富的数学运算方法。

const x = new Decimal('10');
const y = new Decimal('3');

// 加法
x.plus(y) // 13
// 减法
x.minus(y) // 7
// 乘法
x.times(y) // 30
// 除法
x.dividedBy(y) // 3.3333333333333333333
// 取模
x.mod(y) // 1
// 幂运算
x.pow(2) // 100
// 平方根
x.sqrt() // 3.162277660168379332

链式调用与比较

支持链式调用,让连续运算更简洁。

// 链式调用示例:(0.1 + 0.2) * 10 / 3
const result = new Decimal('0.1').plus('0.2').times('10').dividedBy('3');
console.log(result.toString()); // 输出 "1"

// 比较大小
const num1 = new Decimal('0.1');
const num2 = new Decimal('0.2');
console.log(num1.lessThan(num2)); // true
console.log(num1.equals('0.1')); // true

精度与格式控制

可以全局设置精度和舍入模式,也支持灵活的结果格式化。

// 全局设置精度为4位,舍入模式为四舍五入
Decimal.set({ precision: 4, rounding: Decimal.ROUND_HALF_UP });

const num = new Decimal('1.23456');
console.log(num.toString()); // 输出 "1.2346"

// 格式化输出
const money = new Decimal('12345.6789');
console.log(money.toFixed(2)); // "12345.68"
console.log(money.toPrecision(6)); // "12345.7"

💎 实践建议

  • ​初始化推荐字符串​​:创建 Decimal 对象时,强烈推荐使用字符串(如 new Decimal('0.1'))而非数字字面量(如 new Decimal(0.1)),以防止数字在传入构造函数前就因 JavaScript 自身的精度问题而失真。
  • ​结果输出​​:运算结果应优先使用 .toString().toFixed()转换为字符串使用。谨慎使用 .toNumber()将其转回原生的 Number 类型,因为这可能再次引入精度问题。
  • ​性能与配置​​:根据实际业务需求(如金融计算通常只需2位小数)通过 Decimal.set配置合适的精度,避免不必要的计算开销。

decimal.js 的开源地址和相关资源如下:

📂 官方开源地址

💡 相关资源与同类库

decimal.js 的作者 MikeMcl 还开发了另外两个流行的数学运算库,它们各有特点,你可以根据项目需求选择:

库名称特点适用场景GitHub 地址
​big.js​体积最小,功能侧重基本运算。简单的金融计算等对体积敏感的基础运算。https://github.com/MikeMcl/big.js/
​bignumber.js​功能介于三者之间,支持二进制运算。一些加密计算场景。https://github.com/MikeMcl/bignumber.js/
​decimal.js​功能最全,支持三角函数等高级运算。科学计算等复杂场景。https://github.com/MikeMcl/decimal.js

此外,还有一个功能更全面的数学库 ​​math.js​​,它内部也依赖了 decimal.js,提供了包括单位转换、矩阵等在内部也依赖了 decimal.js,提供了包括单位转换、矩阵等更强大的功能。

© 版权声明
THE END
喜欢就支持一下吧
点赞885 分享