decimal.js 高精度数值计算库使用指南

decimal.js 高精度数值计算库使用指南

【免费下载链接】decimal.js An arbitrary-precision Decimal type for JavaScript 【免费下载链接】decimal.js 项目地址: https://gitcode.com/gh_mirrors/de/decimal.js

项目介绍

decimal.js 是一个用于 JavaScript 的任意精度十进制数类型库,专门解决 JavaScript 原生数值计算中存在的精度丢失问题。该库提供了完整的 API,支持高精度的数学运算、三角函数、对数函数等,广泛应用于财务计算、科学计算、统计分析等对数值精度要求极高的场景。

核心特性

  • 任意精度计算:支持整数和浮点数的高精度运算
  • 完整 API:复现了 JavaScript Number.prototype 和 Math 对象的多数方法
  • 多进制支持:处理十六进制、二进制和八进制数值
  • 无依赖:纯 JavaScript 实现,无需额外依赖
  • 广泛兼容:仅使用 JavaScript 1.5 (ECMAScript 3) 特性
  • TypeScript 支持:包含完整的类型定义文件

安装与引入

通过 npm 安装

npm install decimal.js

在浏览器中直接引入

<script src="path/to/decimal.js"></script>

<!-- 或使用 ES 模块 -->
<script type="module">
  import Decimal from './path/to/decimal.mjs';
</script>

在 Node.js 中使用

// CommonJS 方式
const Decimal = require('decimal.js');

// ES 模块方式
import Decimal from 'decimal.js';
import { Decimal } from 'decimal.js';

基本使用方法

创建 Decimal 对象

// 使用数字创建
const num1 = new Decimal(123.4567);

// 使用字符串创建(推荐,避免精度丢失)
const num2 = new Decimal('123456.7e-3');

// 从现有 Decimal 实例创建
const num3 = new Decimal(num1);

// 验证相等性
num1.equals(num2) && num2.equals(num3) && num1.equals(num3); // true

避免精度丢失的注意事项

// 不推荐:使用数值字面量可能导致精度丢失
new Decimal(1.0000000000000001);         // '1'
new Decimal(88259496234518.57);          // '88259496234518.56'
new Decimal(99999999999999999999);       // '100000000000000000000'

// 推荐:使用字符串避免精度问题
new Decimal('0.7').plus(new Decimal('0.1')); // '0.8'

多进制数值支持

// 十六进制
const hexNum = new Decimal('0xff.f');            // '255.9375'

// 二进制
const binNum = new Decimal('0b10101100');        // '172'

// 八进制
const octNum = new Decimal('0o77');              // '63'

// 运算和转换
const result = hexNum.plus(binNum);              // '427.9375'
result.toBinary();                               // '0b110101011.1111'

基本算术运算

const a = new Decimal('0.1');
const b = new Decimal('0.2');

// 加法
const sum = a.plus(b);           // '0.3'

// 减法
const difference = a.minus(b);   // '-0.1'

// 乘法
const product = a.times(b);      // '0.02'

// 除法
const quotient = a.dividedBy(b); // '0.5'

// 链式调用
const complexResult = a.dividedBy(b).plus(sum).times(9).floor();

数学函数操作

三角函数

const angle = new Decimal('45');

// 正弦函数
const sinValue = angle.sin();    // '0.7071067811865475244'

// 余弦函数
const cosValue = angle.cos();    // '0.7071067811865475244'

// 正切函数
const tanValue = angle.tan();    // '1'

指数和对数函数

const num = new Decimal('100');

// 自然对数
const lnResult = num.ln();       // '4.6051701859880913680'

// 常用对数
const log10Result = num.log10(); // '2'

// 指数函数
const expResult = num.exp();     // '2.6881171418161354484e+43'

平方根和幂运算

const value = new Decimal('16');

// 平方根
const sqrtResult = value.sqrt(); // '4'

// 立方根
const cbrtResult = value.cbrt(); // '2.5198420997897463295'

// 幂运算
const powResult = value.pow(0.5); // '4'

数值格式化和转换

字符串表示

const num = new Decimal('255.5');

// 指数表示法
num.toExponential(5);            // '2.55500e+2'

// 固定小数位
num.toFixed(5);                  // '255.50000'

// 有效数字
num.toPrecision(5);              // '255.50'

// 避免科学计数法
const smallNum = new Decimal('0.0000001');
smallNum.toString();             // '1e-7'
smallNum.toFixed();              // '0.0000001'

分数表示

const piApprox = new Decimal('355').dividedBy('113'); // '3.1415929204'

// 转换为分数
piApprox.toFraction();           // [ '7853982301', '2500000000' ]

// 指定最大分母
piApprox.toFraction(1000);       // [ '355', '113' ]

进制转换

const num = new Decimal('255.9375');

// 转换为二进制
num.toBinary();                  // '0b11111111.1111'

// 转换为十六进制
num.toHex();                     // '0xff.f'

// 转换为八进制
num.toOctal();                   // '0o377.7'

配置和精度控制

全局配置

// 设置精度和舍入模式
Decimal.set({ 
  precision: 5, 
  rounding: Decimal.ROUND_HALF_UP 
});

// 创建独立的配置实例
const CustomDecimal = Decimal.clone({ 
  precision: 9, 
  rounding: Decimal.ROUND_DOWN 
});

const x = new Decimal(5);
const y = new CustomDecimal(5);

x.div(3);                        // '1.6667'
y.div(3);                        // '1.66666666'

可用配置选项

  • precision: 计算结果的最高有效位数(默认:20)
  • rounding: 舍入模式(默认:ROUND_HALF_UP)
  • minE: 最小指数值,低于此值会下溢为0
  • maxE: 最大指数值,高于此值会上溢为Infinity
  • toExpNeg: 使用指数表示法的负指数阈值
  • toExpPos: 使用指数表示法的正指数阈值

特殊数值处理

// 无穷大
const infinity = new Decimal(Infinity);  // 'Infinity'

// NaN
const nan = new Decimal(NaN);            // 'NaN'

// 零值
const zero = new Decimal(0);             // '0'
const negativeZero = new Decimal(-0);    // '-0'

// 检查特殊值
infinity.isFinite();                     // false
nan.isNaN();                             // true
zero.isZero();                           // true

实际应用案例

财务计算

// 货币计算
const price = new Decimal('12.34');
const quantity = new Decimal('10');
const taxRate = new Decimal('0.08');

const subtotal = price.times(quantity);
const tax = subtotal.times(taxRate);
const total = subtotal.plus(tax);

console.log(`总计金额: ${total.toFixed(2)}`); // 总计金额: 133.27

科学计算

// 高精度科学计算
const sampleWeight = new Decimal('0.000123456789');
const numberOfSamples = new Decimal('1000000');

const totalWeight = sampleWeight.times(numberOfSamples);
console.log(`总重量: ${totalWeight.toPrecision(10)}`); // 总重量: 123.4567890

统计分析

// 统计计算
const data = [
  new Decimal('123.456'),
  new Decimal('789.012'),
  new Decimal('345.678')
];

// 求和
const sum = Decimal.sum(...data);

// 平均值
const average = sum.dividedBy(data.length);

console.log(`平均值: ${average.toFixed(3)}`); // 平均值: 419.382

性能优化建议

  1. 使用字符串初始化:避免使用数值字面量,直接使用字符串表示数值
  2. 合理设置精度:根据实际需求设置适当的精度,避免不必要的计算开销
  3. 重用 Decimal 实例:尽可能重用已创建的 Decimal 对象
  4. 批量操作:使用 Decimal 的静态方法进行批量计算

错误处理

try {
  const result = new Decimal('invalid number');
} catch (error) {
  console.error('数值格式错误:', error.message);
}

// 检查数值有效性
const possiblyInvalid = someCalculation();
if (possiblyInvalid.isNaN()) {
  console.warn('计算结果为 NaN');
}

测试和验证

运行测试套件

# 运行所有测试
npm test

# 运行特定测试模块
node test/modules/toFraction

浏览器测试

在浏览器中打开 test/test.html 文件即可运行完整的测试套件。

decimal.js 提供了完善的测试覆盖,确保在各种边界条件下的计算准确性。

总结

decimal.js 是一个功能强大且易用的高精度数值计算库,能够有效解决 JavaScript 中的浮点数精度问题。通过合理的配置和使用,可以在财务、科学、工程等领域实现精确的数值计算。其丰富的 API 和良好的性能使其成为处理高精度计算需求的理想选择。

【免费下载链接】decimal.js An arbitrary-precision Decimal type for JavaScript 【免费下载链接】decimal.js 项目地址: https://gitcode.com/gh_mirrors/de/decimal.js

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值