在前端開發中,我們時常需要進行數字運算,然而由于 JavaScript 的數字類型精度問題,一些運算結果會出現不準確的情況。這時候就需要用到 bignumber,它是一個 JavaScript 庫,可以處理任意精度的數值,避免了由浮點數精度誤差導致的問題。
舉個例子,假設我們需要計算兩個極端大的數相乘,使用普通的 JavaScript 進行運算會出現以下結果:
let a = 9999999999999999; let b = 9999999999999999; console.log(a * b); // 輸出 99999999999999980000000000000001
可見,普通的 JavaScript 對于極端大的數字無法準確計算。這時候就需要用到 bignumber:
const BN = require('bignumber.js'); let a = new BN('9999999999999999'); let b = new BN('9999999999999999'); console.log(a.times(b).toString()); // 輸出 99999999999999980000000000000001
可以看到,使用 bignumber 進行運算時可以得到準確的結果。
bignumber 中的一些基本操作也與普通的 JavaScript 進行運算略有不同。例如,在普通 JavaScript 中,使用除法運算時若除數為 0 會直接報錯,而在 bignumber 中則保持了數學的規則,將除 0 視為 Infinity,所得結果為 NaN(非數字)。
下面是一些常用的 bignumber 操作:
// 加法 console.log(new BN('100').plus('200').toString()); // 輸出 300 // 減法 console.log(new BN('5').minus('2').toString()); // 輸出 3 // 乘法 console.log(new BN('3').times('4').toString()); // 輸出 12 // 除法 console.log(new BN('10').dividedBy('3').toString()); // 輸出 3.33333333333333333333 // 取余 console.log(new BN('10').mod('3').toString()); // 輸出 1 // 次方 console.log(new BN('2').exponentiatedBy('3').toString()); // 輸出 8
在使用 bignumber 進行運算時,可以通過設置精度、四舍五入等配置來獲得更符合需求的結果。例如,在進行除法運算時,我們可以設置精度為 10 位小數保留,同時我們又需要四舍五入得到更直觀的結果,可以使用以下方式:
console.log(new BN('100').dividedBy('3').toFixed(10).toString()); // 輸出 33.3333333333 console.log(new BN('100').dividedBy('3').toNumber()) // 輸出 33.333333333333336
需要注意的是,JavaScript 中的數字默認采用二進制存儲方式,而 bignumber 中則采用了十進制存儲方式,因此在將 bignumber 轉換為普通 JavaScript 數字時可能會出現精度誤差的情況,需要謹慎使用。
總之,bignumber 是一個非常好用的 JavaScript 庫,可以解決普通 JavaScript 中數字精度不足的問題,對于需要進行高精度運算的場景非常有用。