js 實現精確加減乘除運算之BigDecimal.js

在前端實際開發中,進行前端計算會出現丟失精度的問題,這裏咱們項目中運用了BigDecimal.js。前端

js計算丟失精度緣由

計算機的二進制實現和位數限制有些數沒法有限表示。就像一些無理數不能有限表示,如 圓周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 規範,採用雙精度存儲(double precision),佔用 64 bit。如圖:bash

表明意義:1位用來表示符號位 11位用來表示指數 52位表示尾數ide

浮點數,好比

0.1 >> 0.0001 1001 1001 1001…(1001無限循環)
0.2 >> 0.0011 0011 0011 0011…(0011無限循環)
複製代碼

此時只能模仿十進制進行四捨五入了,可是二進制只有 0 和 1 兩個,因而變爲 0 舍 1 入。這便是計算機中部分浮點數運算時出現偏差,丟失精度的根本緣由。spa

大整數的精度丟失和浮點數本質上是同樣的,尾數位最大是 52 位,所以 JS 中能精準表示的最大整數是 Math.pow(2, 53),十進制即 9007199254740992。code

大於 9007199254740992 的可能會丟失精度

9007199254740992     >> 10000000000000...000 // 共計 53 個 0
9007199254740992 + 1 >> 10000000000000...001 // 中間 52 個 0
9007199254740992 + 2 >> 10000000000000...010 // 中間 51 個 0
複製代碼

實際上:

9007199254740992 + 1 // 丟失
9007199254740992 + 2 // 未丟失
9007199254740992 + 3 // 丟失
9007199254740992 + 4 // 未丟失
複製代碼

解決方案之BigDecimal.js[BigDecimal.js的用法]

加法(四捨五入保留兩位小數)

new BigDecimal("2.555555").add(new BigDecimal("5.222222")).setScale(2, MathContext.ROUND_HALF_UP).toString();
複製代碼

減法

new BigDecimal("2.40").subtract(new BigDecimal("2"))
複製代碼

乘法

new BigDecimal("2.40").multiply(new BigDecimal("2"))
複製代碼

除法

new BigDecimal("2.40").divide(new BigDecimal("2"), def)
複製代碼

這裏只是項目總結以及分享,BigDecimal.js須要你們自行下載cdn

相關文章
相關標籤/搜索