JavaScript利用BigNumber處理高精度的數(shù)字運(yùn)算
一、BigNumber.js介紹
1、什么是 BigNumber.js
BigNumber.js 是一個 JavaScript 庫,用于處理高精度的數(shù)字運(yùn)算。它解決了 JavaScript 原生 Number 類型在處理大數(shù)或高精度計算時的局限性。由于 JavaScript 的 Number 類型基于 IEEE 754 標(biāo)準(zhǔn)(雙精度浮點(diǎn)數(shù)),其精度限制為 53 位有效數(shù)字,因此在處理大數(shù)或需要高精度的場景下容易出現(xiàn)精度丟失的問題。
BigNumber.js專注于十進(jìn)制精度運(yùn)算,內(nèi)部使用字符串進(jìn)行十進(jìn)制模擬,完全避免了 JS 的二進(jìn)制浮點(diǎn)誤差。默認(rèn)不會丟失精度,也不會四舍五入除非你手動指定。在很多真實(shí)應(yīng)用場景中(如金融、金額、電商)至關(guān)重要。
// 精度計算問題 console.log(0.1+0.2); // 0.30000000000000004 // 大數(shù)比較問題,超過2^53 - 1 = 9007199254740991的數(shù)字會丟失精度 console.log(15615616981519815 === 15615616981519816)
2、作用領(lǐng)域
BigNumber.js 的主要作用領(lǐng)域包括但不限于以下場景:
- 金融計算:貸款利息計算、匯率轉(zhuǎn)換、交易金額處理等。
- 科學(xué)計算:天文學(xué)中的距離計算、化學(xué)中的分子量計算等。
- 區(qū)塊鏈與加密貨幣:比特幣、以太坊等加密貨幣的交易金額等。
- 數(shù)據(jù)統(tǒng)計與分析:統(tǒng)計報表、數(shù)據(jù)分析工具等。
- 其他高精度需求場景:游戲開發(fā)中的經(jīng)濟(jì)系統(tǒng)(虛擬貨幣)、電子商務(wù)中的價格計算等。
3、核心特性
BigNumber.js 的核心特性使其成為處理高精度數(shù)字的理想選擇:能支持任意精度;每次操作都會返回一個新的BigNumber對象,不修改原始對象;支持豐富的數(shù)學(xué)運(yùn)算;支持多種格式化輸出方式;配置靈活且跨平臺兼容。
二、安裝配置與基礎(chǔ)用法
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 提供了全局配置選項,可以設(shè)置默認(rèn)精度、舍入模式等。這些配置對所有 BigNumber 實(shí)例生效。
BigNumber.config({
DECIMAL_PLACES: 10, // 設(shè)置小數(shù)點(diǎn)后保留位數(shù)
ROUNDING_MODE: BigNumber.ROUND_HALF_UP, // 四舍五入
EXPONENTIAL_AT: [-15, 20], // 設(shè)置科學(xué)計數(shù)法的觸發(fā)范圍
});
- DECIMAL_PLACES:控制小數(shù)點(diǎn)后的保留位數(shù)。
- ROUNDING_MODE:定義舍入模式,支持以下選項:
- BigNumber.ROUND_UP:向上取整。
- BigNumber.ROUND_DOWN:向下取整。
- BigNumber.ROUND_HALF_UP:四舍五入。
- BigNumber.ROUND_HALF_DOWN:五舍六入。
- EXPONENTIAL_AT :設(shè)置科學(xué)計數(shù)法的觸發(fā)范圍。例如,[-15, 20] 表示當(dāng)數(shù)字小于 1e-15 或大于 1e20 時,會自動轉(zhuǎn)換為科學(xué)計數(shù)法。
你也可以在創(chuàng)建 BigNumber 實(shí)例時用局部配置代替全局配置:
const num = new BigNumber('1.23456789', { DECIMAL_PLACES: 5 });
console.log(num.toString()); // 輸出:1.23457
3、常用方法
以下是一些常用的 BigNumber.js 方法及其用途:
①創(chuàng)建 BigNumber 實(shí)例
const num = new BigNumber('123456789.123456789');
console.log(num.toString()); // 輸出:123456789.123456789
②基本運(yùn)算
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
③冪運(yùn)算
const num = new BigNumber('2');
console.log(num.pow(10).toString()); // 冪運(yùn)算: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()); // 默認(rèn)格式:123456789.123456789
console.log(num.toFormat(2)); // 格式化為兩位小數(shù):123,456,789.12
console.log(num.toExponential(2)); // 科學(xué)計數(shù)法:1.23e+8
⑧鏈?zhǔn)秸{(diào)用
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、大數(shù)精度丟失問題
JavaScript 原生 Number 類型在處理非常大的數(shù)字或小數(shù)時會出現(xiàn)精度丟失,而 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、小數(shù)運(yùn)算精度問題
原生 JavaScript 在處理小數(shù)運(yùn)算時可能會出現(xiàn)浮點(diǎn)數(shù)精度誤差,而 BigNumber.js 能確保精確結(jié)果。
// 原生 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、大數(shù)乘除法精度問題
原生 JavaScript 在處理大數(shù)乘/除法時可能會丟失精度,而 BigNumber.js 能確保精確結(jié)果。
// 原生 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(正確)
四、總結(jié)
BigNumber.js 是為了解決 JS 在處理“十進(jìn)制小數(shù)”時精度丟失的問題而生的。相比之下,其他庫要么功能更復(fù)雜(decimal.js)、要么精度控制不默認(rèn)(math.js)、要么只處理整數(shù)(BigInt)。
到此這篇關(guān)于JavaScript利用BigNumber處理高精度的數(shù)字運(yùn)算的文章就介紹到這了,更多相關(guān)JavaScript BigNumber內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
20條學(xué)習(xí)javascript的編程規(guī)范的建議
本文總結(jié)了20條javascript的編程規(guī)范,都是平時項目中使用的時候需要注意的地方,這里推薦給大家,如對大家有所幫助,那便是極好的了。2014-11-11
javascript讀取xml實(shí)現(xiàn)javascript分頁
這篇文章主要介紹了javascript讀取xml數(shù)據(jù)對其實(shí)現(xiàn)javascript分頁效果,大家參考使用吧2013-12-12
webpack?output.library的16?種取值方法示例
這篇文章主要為大家介紹了webpack?output.library的16?種取值方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
uni-app中onBackPress()監(jiān)聽頁面返回(更新數(shù)據(jù))
這篇文章主要給大家介紹了關(guān)于uni-app中onBackPress()監(jiān)聽頁面返回(更新數(shù)據(jù))的相關(guān)資料,在UniApp中,可以通過監(jiān)聽頁面刷新的生命周期函數(shù)來監(jiān)聽頁面的返回,然后重新調(diào)用接口進(jìn)行刷新,需要的朋友可以參考下2023-10-10

