// 小数的精确除法
export function accDivision(arg1: number, arg2: number) {
const r1 = String(arg1);
const r2 = String(arg2);
let m: any = null;
let resultVal: any = null;
const d = arguments[2];
m = (r2.split('.')[1] ? r2.split('.')[1].length : 0) - (r1.split('.')[1] ? r1.split('.')[1].length : 0);
resultVal = Number(r1.replace('.', '')) / Number(r2.replace('.', '')) * Math.pow(10, m);
return typeof d !== 'number' ? Number(resultVal) : Number(resultVal.toFixed(parseInt(String(d), 10)));
}
// 小数的精确乘法
export function accMultiplication(arg1: number, arg2:number) {
const r1 = String(arg1); // 将传入的数据转化为字符串
const r2 = String(arg2);
let m: any = null;
let resultVal: any = null;
const d = arguments[2];
m = (r1.split('.')[1] ? r1.split('.')[1].length : 0) + (r2.split('.')[1] ? r2.split('.')[1].length : 0); // 获取两个数字的小数位数的和
// 乘积的算法就是去掉小数点做整数相乘然后除去10的所有小数位的次方
resultVal = Number(r1.replace('.', '')) * Number(r2.replace('.', '')) / Math.pow(10, m);
return typeof d !== 'number' ? Number(resultVal) : Number(resultVal.toFixed(parseInt(String(d), 10)));
}
// 小数的精确加法
export function accAdd(...args: number[]): number {
// 判断值是不是全是null
const tsNullArr = args?.filter(item => item === null);
if (tsNullArr.length === args.length) return null;
let r1 = 0;
let r2 = 0;
const copyArgsArr = JSON.parse(JSON.stringify(args));
try {
r1 = args[0].toString().split('.')[1].length;
} catch (e) { r1 = 0; }
try {
r2 = args[1].toString().split('.')[1].length;
} catch (e) { r2 = 0; }
const m = Math.pow(10, Math.max(r1, r2));
const res = accDivision((accMultiplication(args[0] || 0, m) + accMultiplication(args[1] || 0, m)) || 0, m);
if (args.length >= 3) {
return accAdd(res, ...copyArgsArr.slice(2));
}
return res;
}
前端 小数点 精确 运算
最新推荐文章于 2024-07-29 17:28:29 发布