BigNumber.js

在新公司的第一個項目是區塊鏈相關的管理後臺和交易所,其中就涉及了很多的計算問題。而JavaScript因爲存在計算的精度問題,所以直接計算就可能會導致各種各樣的bug,爲了解決這個問題,就要使用BigNumber.js這個庫。

至於爲什麼JavaScript會有精度問題呢,可以看這裏。簡單來說就是因爲:JavaScript中所有的數字(包括整數和小數)都只有一種類型–Number。它的實現遵循IEEE 754標準,使用64位固定長度來表示,也就是標準的double雙精度浮點數。它的優點是可以歸一化處理整數和小數,節省儲存空間。而實際計算的時候會轉換成二進制計算再轉成十進制。進制轉換之後會很長,捨去一部分,計算再轉回來,就有了精度誤差。

BigNumber.js是一個用於任意精度計算的js庫。可以在 官方文檔 的console中測試使用。也可以通過npm install bignumber.js --save來安裝。然後 import BigNumber from 'bignumber.js' 來引入使用。他的大概原理是將所有數字當做字符串,重新實現了計算邏輯。缺點是性能比原生的差很多。

現在 TC39 已經有一個 Stage 3 的提案 proposal bigint,大數問題有望徹底解決。在瀏覽器正式支持前,可以使用 Babel 7.0 來實現,它的內部是自動轉換成 big-integer 來計算,要注意的是這樣能保持精度但運算效率會降低。

具體用法可以參考以下資料:

就不再敖述了,下邊隨便寫點常用的方法:

// 轉爲 bignumber
const x= new BigNumber('123456789.123456789');
// 轉爲 普通數字
x.toNumber()

// 格式化(小數點)
x.toFormat()    // '123,456,789.123456789'
x.toFormat(3)   // '123,456,789.123'

// 計算
x.plus(0.1)  // 加法
x.minus(0.1)  // 減法
x.times(0.1)  // 乘法
x.div(0.1)  // 除法
x.mod(3)  // 取模/取餘

// 比較大小
x.eq(y) // isEqualTo 的簡寫,是否相等
x.gt(y) // isGreaterThan 的簡寫,是否大於
x.gte(y) // isGreaterThanOrEqualTo 的簡寫,是否大於等於
x.lt(y) // isLessThan 的簡寫,是否小於
x.lte(y) // isLessThanOrEqualTo 的簡寫,是否小於等於

// 取非,改變數字的正負號
x.negated() 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章