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))