衆所周知,計算機在計算浮點數的過程中會丟失精度。這在編程語言中都會出現,js也不例外。
0.1+0.2並不等於0.3
這就導致了在某些情況下,如果單純的採用四捨五入toFixed 會出現我們不想要的結果。尤其在計算金額方面,一分都不能出錯。
爲此java中的JDK中提供了BigDecimal類來解決丟失精度的問題。js中也有這樣一個庫,叫做decimal.js。
特點:
- 整數型和浮點型
- 簡單並且全面的 API
- 複製了很多 JavaScript 中
Number.prototype
(Number 類型屬性) 和Math
類 - 能夠處理 十進制 二進制 八進制的值
- 相比較java 中的 BigDecimal,decimal.js 更加快 、更小、易於使用
- 無依賴
- 兼容性好:僅僅使用了 JavaScript 1.5 (ECMAScript 3)的一些功能與特性
- 全面的文檔和測試用例
- 包含一個 TypeScript 的聲明文件: decimal.d.ts
你可以在github上找到它:https://github.com/MikeMcl/decimal.js
這樣使用 就可以解決掉丟失精度的問題了
const a = 9.99;
const b = 8.03;
// 加法 c= a + b
let c = new Decimal(a).add(new Decimal(b))
// 減法 d = a - b
let d = new Decimal(a).sub(new Decimal(b))
// 乘法 e = a * b
let e = new Decimal(a).mul(new Decimal(b))
// 除法 f = a/b
let f = new Decimal(a).div(new Decimal(b))