js中關于number類型的計算
因:在js中,number類型是用于表示數值的基本類型,它遵循 IEEE 754 雙精度浮點數(64 位)標準。這導致在某些計算中可能出現精度問題。
例:console.log(0.1 + 0.2); // 0.30000000000000004
我這里出于個人習慣,使用三方庫big.js來解決精度問題
npm install big.js
import Big from 'big.js';const a = new Big(0.1);
const b = new Big(0.2);
const result = a.plus(b);console.log(result.toString()); // "0.3" ?
順便貼一下常見用法示例,便于我日后追溯
import Big from 'big.js';// 創建 Big 實例
const a = new Big(0.1);
const b = new Big(0.2);// 加法
console.log(a.plus(b).toString()); // "0.3"// 減法
console.log(b.minus(a).toString()); // "0.1"// 乘法
console.log(a.times(b).toString()); // "0.02"// 除法
console.log(b.div(a).toString()); // "2"// 比較
console.log(a.lt(b)); // true(小于)
console.log(a.eq(b)); // false(等于)
在項目過程中,還有很多實際問題需要考慮,比如:new Big中傳入了非法值,(undefined,null,NaN,‘字符串’) 都會出現Invalid number報錯。
嘗試使用方法
- 使用??過濾一下?
b.minus(a ?? 0) // 有很大問題,只能過濾null與undefined,并沒有過濾'' 還是會報錯,不可取
- 使用??‘’
b.minus(((a ?? '') === '') ? 0 : a) // 過濾掉了'',算是解決了大部分問題
- 使用函數封裝
function safeBig(val: any): Big {const num = Number(String(val).trim()) // 這里有個知識點,Number不會拋錯,只會返回NaNreturn isFinite(num) ? new Big(num) : new Big(0)
}// 計算
safeBig(a).minus(safeBig(b))