国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何在 Node.js 應用程序中處理大數(shù)

這篇具有很好參考價值的文章主要介紹了如何在 Node.js 應用程序中處理大數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

如何在 Node.js 應用程序中處理大數(shù)

計算機很難在不損失精度的情況下準確地表示具有很多個有效數(shù)字的數(shù)字。當你將超過 JavaScript 中最大安全整數(shù)限制的整數(shù)存儲為普通整數(shù)時,它們會失去精度。

在 JavaScript 生態(tài)系統(tǒng)中,你可以使用 BigInt 來處理大整數(shù)。但是,你也可以使用具有類似于 BigInt 功能的第三方庫。

本文將是使用 BigInt 和提供類似功能的流行庫管理大數(shù)的完整指南。我們還將比較第三方庫的用例、優(yōu)勢和劣勢。

JavaScript 如何編碼數(shù)字?

表示大數(shù)時精度損失的挑戰(zhàn)并不是 JavaScript 獨有的。在內(nèi)部,JavaScript 使用雙精度二進制浮點格式來表示數(shù)字。

雙精度二進制浮點格式

雙精度二進制浮點格式由 IEEE 標準 754 定義。它使用 64 位來表示帶符號的浮點數(shù)。用雙精度二進制浮點數(shù)表示的數(shù)由符號、尾數(shù)和指數(shù)三部分組成,如下圖所示:

image.png

雙精度二進制浮點格式將 64 位分配給這三部分。它使用 1 位編碼符號,11 位編碼偏置指數(shù),52 位編碼尾數(shù)或尾數(shù)。

下面的示例顯示了十進制數(shù) -1.7976931348623157e+308 的內(nèi)部雙精度二進制浮點數(shù)表示。我使用了 ? 字符來分隔這三個部分的編碼。

第一位編碼符號。因為我們正在編碼一個負數(shù),所以它的值為一。如果我們編碼一個正數(shù),它的值將為零。隨后的 11 位編碼偏置指數(shù),最后 52 位編碼尾數(shù):

1?11111111110?1111111111111111111111111111111111111111111111111111

計算機只能理解二進制。因此,在存儲或執(zhí)行數(shù)學運算之前,JavaScript 在內(nèi)部將每個數(shù)字轉換為雙精度二進制浮點格式,如上例所示。

然而,某些數(shù)字無法準確地用二進制表示。因此,當你將某些數(shù)字從十進制轉換為二進制再轉換回十進制時,它們會失去精度。

同樣,JavaScript 使用固定位數(shù)對雙精度二進制浮點數(shù)的不同部分進行編碼。因此,在處理大整數(shù)時,你需要使用第三方庫或內(nèi)置的 bigint 類型。

JavaScript 中的最小和最大安全整數(shù)

由于雙精度格式將表示尾數(shù)的位數(shù)限制為 53,因此你可以使用的 JavaScript 整數(shù)的精度和準確性存在限制。

你可以在不丟失精度的情況下使用的最大安全整數(shù)是 2 ** 53 - 1。它也是使用 Number.MAX_SAFE_INTEGER 訪問 Number 構造函數(shù)的靜態(tài)數(shù)據(jù)屬性:

console.log(2 ** 53 - 1 === Number.MAX_SAFE_INTEGER) // true

還有一個對應的最小安全整數(shù),其值為-(2**53-1)。你可以使用 Number.MIN_SAFE_INTEGER 靜態(tài)屬性訪問它的值:

console.log(-(2 ** 53 - 1) === Number.MIN_SAFE_INTEGER) // true

你執(zhí)行的任何涉及大于最大安全整數(shù)或小于最小安全整數(shù)的整數(shù)的數(shù)學運算都將導致意外的近似結果:

const maxSafeInteger = Number.MAX_SAFE_INTEGER;
const minSafeInteger = Number.MIN_SAFE_INTEGER;

console.log(maxSafeInteger + 1); // 9007199254740992
console.log(maxSafeInteger + 2); // 9007199254740992
console.log(maxSafeInteger + 1 === maxSafeInteger + 2); // true

console.log(minSafeInteger - 1); // -9007199254740992
console.log(minSafeInteger - 2); // -9007199254740992
console.log(minSafeInteger - 1 === minSafeInteger - 2); // true

JavaScript 中的正無窮大和負無窮大

就像上面的最小和最大安全整數(shù)一樣,JavaScript 有一個它可以在內(nèi)部表示的最大數(shù)值。該值為 2 ** 2014 - 1。你可以使用 Number.MAX_VALUE 數(shù)據(jù)屬性訪問它。

JavaScript 使用 Infinity 表示任何超過 Number.MAX_VALUE 的數(shù)值,并使用 -Infinity 表示相應的負值,如下例所示:

console.log(Number.MAX_VALUE * 2); // Infinity
console.log(Number.MAX_VALUE * 3); // Infinity
console.log(-Number.MAX_VALUE * 3); // -Infinity

盡管 Infinity 在 Node 中是全局的,但你可以使用 Number.POSITIVE_INFINITY 數(shù)據(jù)屬性訪問它,并使用 Number.NEGATIVE_INFINITY 數(shù)據(jù)屬性訪問 -Infinity 。

如何使用 BigInt 在 JavaScript 中管理大整數(shù)

正如前面部分所介紹的那樣,JavaScript 在內(nèi)部使用雙精度格式來表示數(shù)字。因為它使用 53 位來編碼尾數(shù),所以你可以在 JavaScript 中使用的最大安全整數(shù)是 2**53 - 1。

要安全地處理大于最大安全整數(shù)的整數(shù),你需要 bigint 類型。它是在不損失精度的情況下操作大整數(shù)的內(nèi)置功能。

你可以通過將 n 附加到整數(shù)或使用 BigInt 函數(shù)來創(chuàng)建 bigint 類型。因為 BigInt 不是構造函數(shù),所以不使用 new 關鍵字調(diào)用它,如下面的示例所示:

const number = 1n;
console.log(1n + 2n); // 3n

const maxSafeInt = BigInt(Number.MAX_SAFE_INTEGER);
console.log(maxSafeInt + 1n); // 9007199254740992n
console.log(maxSafeInt + 2n); // 9007199254740993n
console.log(maxSafeInt * maxSafeInt); // 81129638414606663681390495662081n

與普通的數(shù)字類型不同,你不能將內(nèi)置的 Math 方法與 BigInt 值一起使用。但是,你可以使用 bigint 類型執(zhí)行基本的數(shù)學運算,例如加法、減法求冪

console.log(2n + 3n) // 5n
console.log(2n - 3n)  // -1n
console.log(2n ** 3n) // 8n
console.log(4n % 3n)  // 1n
console.log(BigInt(3) - 4n) // -1n

由于你只能使用 bigint 類型執(zhí)行基本的數(shù)學運算,因此在 JavaScript 中處理大量數(shù)字時,你可能需要為某些用例使用第三方庫。

在 JavaScript 中管理大數(shù)的庫

除了內(nèi)置的 bigint 類型之外,還有幾個第三方庫可以在 JavaScript 中處理大數(shù)字。其中一些庫附帶了 BigInt 可能不提供的解決方案。

但是,與任何第三方庫一樣,使用它們也有缺點。它們伴隨著額外的打包大小、維護、安全和許可問題。

使用 Math.js 管理大數(shù)

Math.js 是一個免費、開源且功能豐富的數(shù)學庫。你既可以在瀏覽器中使用它,也可以在 Node 運行時環(huán)境中使用它。

雖然它是一個功能豐富的庫,但在本文中,我們將使用 Math.js 在 Node 運行時環(huán)境中管理大數(shù)。用你的包管理器 npm 安裝它,如下所示:

# npm 
npm i mathjs

# yarn
yarn add mathjs

#pnpm
pnpm add mathjs

安裝 Math.js 后,你可以使用默認配置加載和使用它,如下例所示:

const { add, subtract, evaluate }= require('mathjs');

const sum = add(2, 3);
const difference = subtract(2, 3);
const anotherSum = evaluate('2 + 3');

console.log(sum); // 5
console.log(difference}); // -1
console.log(anotherSum}); // 5

你可以使用自定義配置創(chuàng)建一個 Math.js 實例,而不是使用默認配置的 Math.js 內(nèi)置函數(shù):

const { create, all } = require("mathjs");

const config = {};
const math = create(all, config);

console.log(math.add(2, 3)); // 5
console.log(math.pow(2, 3)); // 8
console.log(math.divide(4, 2)); // 2
console.log(math.multiply(2, 3)); // 6

Math.js 具有專門用于處理大數(shù)的 BigNumber 數(shù)據(jù)類型。

在上面的一個部分中,我們強調(diào)了在使用內(nèi)置數(shù)字類型時,JavaScript 使用 Infinity 表示超過最大可表示數(shù)值的數(shù)字。

使用 Math.js,你可以表示超過最大可表示數(shù)的數(shù)字并對它們執(zhí)行數(shù)學運算。但是,請注意,對 BigNumber 類型執(zhí)行數(shù)學運算比對普通數(shù)字類型執(zhí)行數(shù)學運算要慢

const { create, all } = require("mathjs");

const config = {};
const math = create(all, config);

const maxValue = math.bignumber(Number.MAX_VALUE);
console.log(math.add(maxValue, maxValue)); // 3.5953862697246314e+308

const maxSafeInt = math.bignumber(Number.MAX_SAFE_INTEGER);

console.log(math.square(maxSafeInt)); // 8.1129638414606663681390495662081e+31
console.log(math.add(maxSafeInt, maxSafeInt)); // 18014398509481982
console.log(math.subtract(maxSafeInt, maxSafeInt)); // 0
console.log(math.multiply(maxSafeInt, math.bignumber(2))); // 18014398509481982
console.log(math.divide(maxSafeInt, math.bignumber(2))); // 4503599627370495.5

console.log(math.log10(maxSafeInt)); // 15.95458977019100329811178809273377220616031325194798178472905735
console.log(math.pow(maxSafeInt, math.bignumber(2))); // 8.1129638414606663681390495662081e+31

使用 bignumber.js 管理大數(shù)

bignumber.js 是另一個用于管理任意精度十進制和非十進制數(shù)的 JavaScript 庫。它是一個免費、開源、MIT 許可的庫,用于處理大數(shù)據(jù)。

它可在瀏覽器、Node 和 Deno 中運行。要開始使用 bignumber.js,請用 npm 安裝它:

# npm 
npm i bignumber.js

# yarn
yarn add bignumber.js

#pnpm
pnpm add bignumber.js

安裝后,導入并創(chuàng)建一個 BigNumber 構造函數(shù)的實例,它以數(shù)字、字符串或 BigNumber 類型作為參數(shù)并返回一個對象。

在下面的示例中,我使用 commonjs 語法導入 bignumber.js。它還支持 ES 語法。如果你打算在沒有 JavaScript 打包器的情況下在瀏覽器環(huán)境中使用 bignumber.js,你也可以通過 CDN 訪問它:

const BigNumber = require("bignumber.js");

const distanceOfTheSun = new BigNumber('1.49597870700e11'); // 
console.log(distanceOfTheSun) // BigNumber { s: 1, e: 11, c: [ 149597870700 ] }
console.log(distanceOfTheSun.valueOf()) // 149597870700

當使用內(nèi)置數(shù)字類型時,JavaScript 會將任何大于 Number.MAX_VALUE 的數(shù)值表示為 Infinity。但是,對于 bignumber.js,你可以使用任何大于 Number.MAX_VALUE 的值。

在下面的示例中,我通過將 Number.MAX_VALUE 作為字符串傳遞并計算其平方來創(chuàng)建 BigNumber 的實例。如果你使用內(nèi)置的 JavaScript 數(shù)字類型做同樣的事情,你會得到 Infinity

const BigNumber = require("bignumber.js");

console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
console.log(Number.MAX_VALUE ** 2) // Infinity

const maxValue = new BigNumber(Number.MAX_VALUE.toString());
const square = maxValue.exponentiatedBy("2");

console.log(square.valueOf()); // 3.23170060713109998320439596646649e+616

const squareRoot = square.squareRoot();
console.log(squareRoot.valueOf()); // 1.7976931348623157e+308
console.log(squareRoot.isEqualTo(maxValue)); // true

但是,當處理無法在 JavaScript 中表示的如此大的數(shù)字時,請使用 toStringvalueOf 方法以字符串形式訪問計算結果。

toNumber 方法會將你的計算結果強制轉換為 JavaScript 數(shù)字類型。你仍然會遇到上面突出顯示的相同 JavaScript 大數(shù)問題。你的答案將失去精度,或者 JavaScript 會將其表示為 Infinity

雖然我們在本文中的目標是使用 bignumber.js 包來處理大數(shù),但 bignumber.js 也可以處理相應的小數(shù)。它有幾個我沒有在這里突出展示的內(nèi)置方法。你可以通過查看文檔以了解其他內(nèi)置函數(shù)。

使用 JS Big Decimal 管理大數(shù)

JS Big Decimal 是另一個可用于處理大數(shù)的 JavaScript 庫。與上面的同類庫不同,JS Big Decimal 的包體積小,并且功能有限。你可以使用它來管理大、小十進制數(shù)。

根據(jù)你的包管理器,使用以下命令之一從 npm 包倉庫安裝 JS Big Decimal:

# npm 
npm i js-big-decimal

# yarn
yarn add js-big-decimal

#pnpm
pnpm add js-big-decimal

與其他兩個包一樣,導入 BigDecimal 構造函數(shù)并創(chuàng)建一個實例,如下例所示。 BigDecimal 構造函數(shù)將數(shù)字或字符串作為參數(shù)并返回 BigDecimal 對象。

然后,你可以使用 getValue 方法以字符串形式訪問數(shù)字的值?;蛘撸绻袷交敵?,請使用 getPrettyValue

const BigDecimal = require("js-big-decimal");

const value = new BigDecimal('23');
console.log(value.add(new BigDecimal(2)).getValue())

JS Big Decimal 具有執(zhí)行基本數(shù)學運算的函數(shù),例如加法、減法乘法除法。下面的代碼演示了如何使用它們來處理大數(shù)據(jù):

const BigDecimal = require("js-big-decimal");

const maxSafeInt = new BigDecimal(Number.MAX_SAFE_INTEGER.toString());
const divisor = new BigDecimal("2");

console.log(maxSafeInt.getPrettyValue()); // 9,007,199,254,740,991

const sum = maxSafeInt.add(maxSafeInt);
const quotient = maxSafeInt.divide(divisor);
const diff = maxSafeInt.subtract(quotient);
const product = quotient.multiply(divisor);

console.log(sum.getValue()); // 18014398509481982
console.log(quotient.getPrettyValue()); // 4,503,599,627,370,495.50000000
console.log(diff.getPrettyValue()); // 4,503,599,627,370,495.50000000
console.log(product.getPrettyValue()); // 9,007,199,254,740,991

比較在 JavaScript 中管理大數(shù)的庫

并非所有庫都是完美的。每個第三方庫都有用例、優(yōu)點和缺點。讓我們通過對比它們的優(yōu)缺點并探索 GitHub 星級和問題、包大小和 npm 下載等指標來比較上述第三方包。

GitHub stars 等指標與社交媒體點贊類似。你可以將其用作第三方庫受歡迎程度的指標。然而,它并沒有告訴你太多關于質(zhì)量的信息。

同樣,npm 下載統(tǒng)計數(shù)據(jù)也遠非精確。根據(jù) npm,下載計數(shù)是 tarball 文件的 HTTP 200 響應服務的數(shù)量。因此,下載計數(shù)包括構建服務器、鏡像和機器人的自動下載。雖然 npm 下載計數(shù)不是庫活躍用戶的準確度量,但你可以使用它來對包進行比較。

Math.js bignumber.js JS Big Decimal
壓縮后的包體積 187.93KB 8.09KB 3.88KB
依賴數(shù)量 9 0 0
GitHub stars 13.1k 6k 96
積極維護 Yes Yes Yes
文檔 Good Good Good
許可證 Apache-2.0 MIT MIT
npm 周下載量 502,656 7,114,325 25,204

上述所有第三方庫都是免費的開源庫,具有許可。在這三者中,Math.js 是一個功能豐富的通用數(shù)學庫,而另外兩個是為管理大數(shù)字而創(chuàng)建的。

因此,Math.js 具有最大的 Gzipped 包大小。但是,如果你使用像 webpack 這樣的打包器,它是可通過 tree-shake 優(yōu)化的。 Math.js 和 bignumber.js 都帶有幾個用于管理大數(shù)和對它們執(zhí)行數(shù)學運算的特性。

另一方面,JS Big Decimal 具有最小的包大小。但是,它的功能也最少。它只能執(zhí)行基本的數(shù)學運算。

小結

JavaScript 在內(nèi)部使用 64 位雙精度二進制浮點格式來表示數(shù)字。它分配一位表示符號,11 位表示指數(shù),53 位表示尾數(shù)。

JavaScript 分配固定位來表示雙精度浮點數(shù)的不同部分。因此,它近似于安全整數(shù)范圍之外的整數(shù)。同樣,它使用 Infinity 表示大于 Number.MAX_VALUE 的數(shù)值,使用 -Infinity 表示它們對應的負值。

盡管內(nèi)置的 BigInt 對于處理大于最大安全整數(shù)或小于最小安全整數(shù)的整數(shù)很有用,但它是有一定局限的,因為你只能執(zhí)行基本的數(shù)學運算,例如加法、減法乘法求冪。你不能將它與內(nèi)置 Math 對象的方法一起使用;這樣做會引發(fā)錯誤。

要在 JavaScript 中處理大數(shù)字而不會遇到上述限制,你需要第三方庫,例如 Math.js、bignumber.js 和 JS Big Decimal。盡管大多數(shù)第三方庫都有局限性,正如上面強調(diào)的那樣,但它們具有輕而易舉處理大數(shù)的功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-500612.html

到了這里,關于如何在 Node.js 應用程序中處理大數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java與Python、Node.js在人工智能和區(qū)塊鏈應用程序開發(fā)中的比較

    背景 Java、Python和Node.js都是常用的編程語言,它們在不同領域都有廣泛的應用。在人工智能和區(qū)塊鏈應用程序開發(fā)中,這三種語言都具有各自的優(yōu)勢和劣勢。 Java的優(yōu)勢 Java在企業(yè)級應用中應用廣泛,這得益于其跨平臺性、安全性和穩(wěn)定性等特點。在人工智能和區(qū)塊鏈應用程序

    2024年02月16日
    瀏覽(28)
  • 如何使用Vue.js構建桌面應用程序

    Vue.js是一個流行的JavaScript框架,可以用于構建Web應用程序。但是,Vue.js也可以用于構建桌面應用程序。本文將介紹如何使用Vue.js構建桌面應用程序,包括以下步驟: 1. 選擇一個Vue.js框架:選擇一個適合你的Vue.js框架。我們推薦使用Electron,因為它是最流行的桌面應用程序框架

    2024年02月15日
    瀏覽(20)
  • 事件驅(qū)動編程:如何在應用程序中處理用戶輸入和交互

    [toc] 引言 1.1. 背景介紹 隨著互聯(lián)網(wǎng)技術的快速發(fā)展,應用程序被廣泛應用于人們的生活和工作中。在這些應用程序中,用戶輸入和交互是必不可少的組成部分。如何優(yōu)雅地處理用戶輸入和交互,讓應用程序更加符合用戶的使用習慣,是擺在每個程序員面前的一個重要問題。

    2024年02月07日
    瀏覽(33)
  • Whisper、React 和 Node 構建語音轉文本 Web 應用程序

    在本文中,我們將使用 OpenAI 的 Whisper 以及 React、Node.js 和 FFmpeg 構建一個語音轉文本應用程序。該應用程序?qū)@取用戶輸入,使用 OpenAI 的 Whisper API 將其合成為語音,并輸出結果文本。Whisper 提供了我用過的最準確的語音到文本轉錄,即使對于非英語母語人士也是如此。 Ope

    2024年02月13日
    瀏覽(17)
  • Node.js 應用的御用品: Node.js 錯誤處理系統(tǒng)

    Node.js 應用的御用品: Node.js 錯誤處理系統(tǒng)

    開發(fā)中,有些開發(fā)者會積極尋求處理錯誤,力求減少開發(fā)時間,但也有些人完全忽略了錯誤的存在。正確處理錯誤不僅意味著能夠輕松發(fā)現(xiàn)和糾正錯誤,而且還意味著能夠為大型應用程序開發(fā)出穩(wěn)健的代碼庫。 特別是對于 Node.js 開發(fā)人員,他們有時會也發(fā)現(xiàn)自己使用了不那么

    2024年02月10日
    瀏覽(37)
  • JMeter-BeanShell預處理程序和BeanShell后置處理程序的應用

    JMeter-BeanShell預處理程序和BeanShell后置處理程序的應用

    BeanShell是用Java寫成的,一個小型的、免費的、可以下載的、嵌入式的Java源代碼解釋器,JMeter性能測試工具也充分接納了BeanShell解釋器,封裝成了可配置的BeanShell前置和后置處理器,分別是 BeanShell Preprocessor(BeanShell預處理程序)和BeanShell Postprocessor(BeanShell后置處理程序),能通

    2024年04月10日
    瀏覽(25)
  • Vue.js + Electron 的跨平臺桌面應用程序開發(fā)

    本文介紹了 Vue.js 和 Electron 的基本特點和原理,并分析了它們在桌面應用程序開發(fā)中的優(yōu)勢和應用場景。在基于 Vue.js 和 Electron 的桌面應用程序開發(fā)實踐中,本文詳細介紹了項目的搭建和配置,包括環(huán)境的準備、項目的初始化和依賴的安裝等步驟。然后,本文介紹了使用 Vu

    2024年02月13日
    瀏覽(19)
  • uniApp開發(fā)微信小程序 異步加載外部JS應用

    uniApp開發(fā)微信小程序 異步加載外部JS應用

    由于微信小程序的限制,上線代碼包不能超過 2M ,一般業(yè)務只是做界面展示與交互的話,這個大小其實完全夠用的,但是當我們想要使用 echarts 這樣的圖表插件時,代碼包很容易就超了。那么我們在不使用分包技術的情況下,也可以考慮使用 we-script 這個功能組件來實現(xiàn)異步

    2024年02月13日
    瀏覽(43)
  • 應用程序被打開時無法顯示界面的處理方法

    應用程序被打開時無法顯示界面的處理方法

    ? ? ? ?有時會遇到:當軟件打開了,但是點擊該軟件圖標的場合,該軟件卻無法顯示界面。 這個時候可以應用以下方法將該軟件顯示出來。 一、alt+tab鍵 ? ? ? ?先按住alt鍵再按一下tab鍵,這時會跳出框顯示所有已打開應用程序。alt鍵不要放,然后再按tab鍵,按一下tab鍵,

    2024年02月11日
    瀏覽(17)
  • Mac應用程序無法打開或文件損壞的處理方法

    Mac應用程序無法打開或文件損壞的處理方法

    大多數(shù)用戶在安裝 Mac 應用時,經(jīng)常會遇到提示 “ XXX.app 已損壞,打不開。您應該將它移到廢紙簍 ” 或 “ 打不開 XXX.app,因為它來自身份不明的開發(fā)者 ” ,如下圖所示: 遇到這種情況,解決的方法很簡單,步驟如下: 打開系統(tǒng)偏好設置界面,進入安全性與隱私 點按左下

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包