JavaScript利用BigNumber处理高精度的数字运算

 更新时间:2025年05月23日 09:28:08   作者:watermelo37  
BigNumber.js 是一个 JavaScript 库,用于处理高精度的数字运算,它解决了 JavaScript 原生 Number 类型在处理大数或高精度计算时的局限性,下面我们来看看它的具体应用吧

一、BigNumber.js介绍

1、什么是 BigNumber.js

BigNumber.js 是一个 JavaScript 库,用于处理高精度的数字运算。它解决了 JavaScript 原生 Number 类型在处理大数或高精度计算时的局限性。由于 JavaScript 的 Number 类型基于 IEEE 754 标准(双精度浮点数),其精度限制为 53 位有效数字,因此在处理大数或需要高精度的场景下容易出现精度丢失的问题。

BigNumber.js专注于十进制精度运算,内部使用字符串进行十进制模拟,完全避免了 JS 的二进制浮点误差。默认不会丢失精度,也不会四舍五入除非你手动指定。在很多真实应用场景中(如金融、金额、电商)至关重要。

// 精度计算问题
console.log(0.1+0.2); // 0.30000000000000004
// 大数比较问题,超过2^53 - 1 = 9007199254740991的数字会丢失精度
console.log(15615616981519815 === 15615616981519816)

2、作用领域

BigNumber.js 的主要作用领域包括但不限于以下场景:

  • 金融计算:贷款利息计算、汇率转换、交易金额处理等。
  • 科学计算:天文学中的距离计算、化学中的分子量计算等。
  • 区块链与加密货币:比特币、以太坊等加密货币的交易金额等。
  • 数据统计与分析:统计报表、数据分析工具等。
  • 其他高精度需求场景:游戏开发中的经济系统(虚拟货币)、电子商务中的价格计算等。

3、核心特性

BigNumber.js 的核心特性使其成为处理高精度数字的理想选择:能支持任意精度;每次操作都会返回一个新的BigNumber对象,不修改原始对象;支持丰富的数学运算;支持多种格式化输出方式;配置灵活且跨平台兼容。

二、安装配置与基础用法

1、引入 BigNumber.js

通过npm安装:

npm install bignumber.js

然后在代码中引入:

const BigNumber = require('bignumber.js');
// 或者(ES6 模块语法)
import BigNumber from 'bignumber.js';

如果不想使用 npm,可以直接通过 CDN 在 HTML 文件中引入:

<script src="https://cdn.jsdelivr.net/npm/bignumber.js/bignumber.min.js"></script>
<script>
    // 使用全局变量 BigNumber
    const num = new BigNumber('123456789.123456789');
    console.log(num.toString());
</script>

2、配置 BigNumber.js

BigNumber.js 提供了全局配置选项,可以设置默认精度、舍入模式等。这些配置对所有 BigNumber 实例生效。

BigNumber.config({
    DECIMAL_PLACES: 10, // 设置小数点后保留位数
    ROUNDING_MODE: BigNumber.ROUND_HALF_UP, // 四舍五入
    EXPONENTIAL_AT: [-15, 20], // 设置科学计数法的触发范围
});
  • DECIMAL_PLACES:控制小数点后的保留位数。
  • ROUNDING_MODE:定义舍入模式,支持以下选项:
  • BigNumber.ROUND_UP:向上取整。
  • BigNumber.ROUND_DOWN:向下取整。
  • BigNumber.ROUND_HALF_UP:四舍五入。
  • BigNumber.ROUND_HALF_DOWN:五舍六入。
  • EXPONENTIAL_AT :设置科学计数法的触发范围。例如,[-15, 20] 表示当数字小于 1e-15 或大于 1e20 时,会自动转换为科学计数法。

你也可以在创建 BigNumber 实例时用局部配置代替全局配置:

const num = new BigNumber('1.23456789', { DECIMAL_PLACES: 5 });
console.log(num.toString()); // 输出:1.23457

3、常用方法

以下是一些常用的 BigNumber.js 方法及其用途:

①创建 BigNumber 实例

const num = new BigNumber('123456789.123456789');
console.log(num.toString()); // 输出:123456789.123456789

②基本运算

BigNumber.js 支持加法、减法、乘法、除法、取模等操作。

const a = new BigNumber('10');
const b = new BigNumber('3');
 
console.log(a.plus(b).toString());       // 加法:13
console.log(a.minus(b).toString());      // 减法:7
console.log(a.times(b).toString());      // 乘法:30
console.log(a.div(b).toString());        // 除法:3.3333333333333333333
console.log(a.mod(b).toString());        // 取模:1

③幂运算

const num = new BigNumber('2');
console.log(num.pow(10).toString()); // 幂运算:1024

④绝对值

const num = new BigNumber('-123.45');
console.log(num.abs().toString()); // 绝对值:123.45

⑤舍入

const num = new BigNumber('1.23456789');
 
console.log(num.toFixed(2, BigNumber.ROUND_UP));     // 向上取整:1.24
console.log(num.toFixed(2, BigNumber.ROUND_DOWN));   // 向下取整:1.23
console.log(num.toFixed(2, BigNumber.ROUND_HALF_UP)); // 四舍五入:1.23

⑥比较

const a = new BigNumber('10');
const b = new BigNumber('20');
 
console.log(a.comparedTo(b)); // 比较:-1(a < b)
console.log(a.isEqualTo(b));  // 判断是否相等:false
console.log(a.isGreaterThan(b)); // 判断是否大于:false
console.log(a.isLessThan(b));  // 判断是否小于:true

⑦格式化输出

const num = new BigNumber('123456789.123456789');
 
console.log(num.toString()); // 默认格式:123456789.123456789
console.log(num.toFormat(2)); // 格式化为两位小数:123,456,789.12
console.log(num.toExponential(2)); // 科学计数法:1.23e+8

⑧链式调用

const result = new BigNumber('10')
    .plus('5')       // 10 + 5 = 15
    .times('2')      // 15 * 2 = 30
    .div('3')        // 30 / 3 = 10
    .pow('2');       // 10^2 = 100
 
console.log(result.toString()); // 输出:100

三、核心特性

1、大数精度丢失问题

JavaScript 原生 Number 类型在处理非常大的数字或小数时会出现精度丢失,而 BigNumber.js 能确保任意精度。

// 原生 JavaScript
console.log(9007199254740992 === 9007199254740993); // 输出:true(错误)
 
// 使用 BigNumber.js
const BigNumber = require('bignumber.js');
 
const num1 = new BigNumber('9007199254740992');
const num2 = new BigNumber('9007199254740993');
console.log(num1.eq(num2)); // 输出:false(正确)

2、小数运算精度问题

原生 JavaScript 在处理小数运算时可能会出现浮点数精度误差,而 BigNumber.js 能确保精确结果。

// 原生 JavaScript
console.log(0.1 + 0.2); // 输出:0.30000000000000004(错误)
 
// 使用 BigNumber.js
const BigNumber = require('bignumber.js');
 
const num1 = new BigNumber('0.1');
const num2 = new BigNumber('0.2');
console.log(num1.plus(num2).toString()); // 输出:0.3(正确)

3、大数乘除法精度问题

原生 JavaScript 在处理大数乘/除法时可能会丢失精度,而 BigNumber.js 能确保精确结果。

// 原生 JavaScript
const weiAmount = 1000000000000000001; // 1 ETH + 1 wei
const ethAmount = weiAmount / 1000000000000000000;
console.log(ethAmount); // 输出:1.0000000000000002(错误)
 
// 使用 BigNumber.js
const BigNumber = require('bignumber.js');
const weiAmount = new BigNumber('1000000000000000001'); // 1 ETH + 1 wei
const ethAmount = weiAmount.div(new BigNumber('1000000000000000000'));
console.log(ethAmount.toString()); // 输出:1.000000000000000001(正确)

四、总结

BigNumber.js 是为了解决 JS 在处理“十进制小数”时精度丢失的问题而生的。相比之下,其他库要么功能更复杂(decimal.js)、要么精度控制不默认(math.js)、要么只处理整数(BigInt)。

到此这篇关于JavaScript利用BigNumber处理高精度的数字运算的文章就介绍到这了,更多相关JavaScript BigNumber内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 20条学习javascript的编程规范的建议

    20条学习javascript的编程规范的建议

    本文总结了20条javascript的编程规范,都是平时项目中使用的时候需要注意的地方,这里推荐给大家,如对大家有所帮助,那便是极好的了。
    2014-11-11
  • 禁止JS运行的代码

    禁止JS运行的代码

    如果我们要让页面上的javascript不运行,方法最简单的就是使用noscript标签,经常被用来屏蔽那些免费空间要加上的JS。
    2011-01-01
  • JS触发服务器控件的单击事件(详解)

    JS触发服务器控件的单击事件(详解)

    下面小编就为大家带来一篇JS触发服务器控件的单击事件(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • javascript读取xml实现javascript分页

    javascript读取xml实现javascript分页

    这篇文章主要介绍了javascript读取xml数据对其实现javascript分页效果,大家参考使用吧
    2013-12-12
  • 在浏览器测试JavaScript的方法小结

    在浏览器测试JavaScript的方法小结

    测试JavaScript代码是一件很痛苦的事情,很多情况下都是写好代码不断刷新测试,其实chrome浏览器的console下就很方便,这里就为大家简单分享一下
    2023-03-03
  • webpack output.library的16 种取值方法示例

    webpack output.library的16 种取值方法示例

    这篇文章主要为大家介绍了webpack output.library的16 种取值方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • ES2015 Symbol 一种绝不重复的值

    ES2015 Symbol 一种绝不重复的值

    这篇文章主要介绍了Symbol是ES2015新增的一种值类型数据,表示一种绝不重复的值,需要的朋友可以参考下
    2016-12-12
  • uni-app中onBackPress()监听页面返回(更新数据)

    uni-app中onBackPress()监听页面返回(更新数据)

    这篇文章主要给大家介绍了关于uni-app中onBackPress()监听页面返回(更新数据)的相关资料,在UniApp中,可以通过监听页面刷新的生命周期函数来监听页面的返回,然后重新调用接口进行刷新,需要的朋友可以参考下
    2023-10-10
  • js 单击式的下拉菜单效果实例

    js 单击式的下拉菜单效果实例

    这篇文章介绍了js 单击式的下拉菜单效果实例,有需要的朋友可以参考一下
    2013-08-08
  • js charAt的使用示例

    js charAt的使用示例

    这篇文章主要介绍了js charAt的使用方法,需要的朋友可以参考下
    2014-02-02

最新评论