最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript利用BigNumber處理高精度的數(shù)字運(yùn)算

 更新時(shí)間:2025年05月23日 09:28:08   作者:watermelo37  
BigNumber.js?是一個?JavaScript?庫,用于處理高精度的數(shù)字運(yùn)算,它解決了?JavaScript?原生?Number?類型在處理大數(shù)或高精度計(jì)算時(shí)的局限性,下面我們來看看它的具體應(yīng)用吧

一、BigNumber.js介紹

1、什么是 BigNumber.js

BigNumber.js 是一個 JavaScript 庫,用于處理高精度的數(shù)字運(yùn)算。它解決了 JavaScript 原生 Number 類型在處理大數(shù)或高精度計(jì)算時(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)重要。

// 精度計(jì)算問題
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)域包括但不限于以下場景:

  • 金融計(jì)算:貸款利息計(jì)算、匯率轉(zhuǎn)換、交易金額處理等。
  • 科學(xué)計(jì)算:天文學(xué)中的距離計(jì)算、化學(xué)中的分子量計(jì)算等。
  • 區(qū)塊鏈與加密貨幣:比特幣、以太坊等加密貨幣的交易金額等。
  • 數(shù)據(jù)統(tǒng)計(jì)與分析:統(tǒng)計(jì)報(bào)表、數(shù)據(jù)分析工具等。
  • 其他高精度需求場景:游戲開發(fā)中的經(jīng)濟(jì)系統(tǒng)(虛擬貨幣)、電子商務(wù)中的價(jià)格計(jì)算等。

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 提供了全局配置選項(xiàng),可以設(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é)計(jì)數(shù)法的觸發(fā)范圍
});
  • DECIMAL_PLACES:控制小數(shù)點(diǎn)后的保留位數(shù)。
  • ROUNDING_MODE:定義舍入模式,支持以下選項(xiàng):
  • BigNumber.ROUND_UP:向上取整。
  • BigNumber.ROUND_DOWN:向下取整。
  • BigNumber.ROUND_HALF_UP:四舍五入。
  • BigNumber.ROUND_HALF_DOWN:五舍六入。
  • EXPONENTIAL_AT :設(shè)置科學(xué)計(jì)數(shù)法的觸發(fā)范圍。例如,[-15, 20] 表示當(dāng)數(shù)字小于 1e-15 或大于 1e20 時(shí),會自動轉(zhuǎn)換為科學(xué)計(jì)數(shù)法。

你也可以在創(chuàng)建 BigNumber 實(shí)例時(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é)計(jì)數(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ù)時(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)算時(shí)可能會出現(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ù)乘/除法時(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ù)”時(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)文章

  • 微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解

    微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解

    這篇文章主要介紹了微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 微信小程序?qū)崿F(xiàn)多選刪除列表數(shù)據(jù)功能示例

    微信小程序?qū)崿F(xiàn)多選刪除列表數(shù)據(jù)功能示例

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)多選刪除列表數(shù)據(jù)功能,涉及微信小程序列表數(shù)據(jù)讀取、顯示、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • 一文教你用純JS實(shí)現(xiàn)一個五子棋游戲

    一文教你用純JS實(shí)現(xiàn)一個五子棋游戲

    實(shí)現(xiàn)一個五子棋游戲, 簡要分析其原理, 頁面并沒有很花哨, 原理搞懂了, 后面的就是很輕松的事了,本文給大家介紹了如何用純JS實(shí)現(xiàn)一個五子棋游戲,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • 如何阻止小程序遮罩層下方圖層滾動

    如何阻止小程序遮罩層下方圖層滾動

    這篇文章主要介紹了如何阻止小程序遮罩層下方圖層滾動,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 怎么判斷js腳本加載完成

    怎么判斷js腳本加載完成

    本篇文章主要是對判斷js腳本加載完成的方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • 淺談JavaScript find 方法不支持IE的問題

    淺談JavaScript find 方法不支持IE的問題

    下面小編就為大家?guī)硪黄獪\談JavaScript find 方法不支持IE的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • CSS和Javascript簡單復(fù)習(xí)資料

    CSS和Javascript簡單復(fù)習(xí)資料

    CSS和Javascript簡單復(fù)習(xí)資料,學(xué)習(xí)css與js的朋友可以參考下。
    2010-06-06
  • TypeScript字符串的常用操作總結(jié)

    TypeScript字符串的常用操作總結(jié)

    這篇文章主要為大家詳細(xì)介紹了TypeScript中字符串的常用操作,例如substring、indexOf、slice、replace等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • uni-app中使用renderjs的詳細(xì)步驟講解

    uni-app中使用renderjs的詳細(xì)步驟講解

    這篇文章主要介紹了uni-app中使用renderjs的詳細(xì)步驟,RenderJS是一種可以直接運(yùn)行在視圖層(webview)中的JavaScript技術(shù),用于優(yōu)化大量DOM操作的性能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • js文件Cookie存取值示例代碼

    js文件Cookie存取值示例代碼

    這篇文章主要介紹了js文件Cookie存取值的使用,需要的朋友可以參考下
    2014-02-02

最新評論

娄底市| 正安县| 巴彦淖尔市| 全州县| 监利县| 监利县| 镇江市| 临安市| 依兰县| 胶南市| 镇江市| 突泉县| 江永县| 江永县| 定陶县| 泾阳县| 鲁山县| 榆中县| 阿克| 涪陵区| 新蔡县| 松原市| 崇州市| 鸡东县| 泗洪县| 惠安县| 浦东新区| 武威市| 神木县| 神池县| 宿州市| 沂南县| 大余县| 吉木萨尔县| 黑河市| 锦州市| 五峰| 南陵县| 平邑县| 柳林县| 金乡县|