数字加减乘除的计算精度问题

// 加法:

export const dcmAdd = (arg1, arg2) => {

let r1 = 0;
let r2 = 0;
let m = 0;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
return (accMul(arg1, m) + accMul(arg2, m)) / m;
}

// 减法:

export const dcmReduce = (arg1, arg2) => {

let r1 = 0;
let r2 = 0;
let m = 0;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
return (accMul(arg1, m) - accMul(arg2, m)) / m;
}

// 除法:
export const accDiv = (arg1, arg2) => {
let t1 = 0;
let t2 = 0;
let r1 = 0;
let r2 = 0;
try {
t1 = arg1.toString().split(".")[1].length;
} catch (e) {
}
try {
t2 = arg2.toString().split(".")[1].length;
} catch (e) {
}
r1 = Number(arg1.toString().replace(".", ""))
r2 = Number(arg2.toString().replace(".", ""))
return (r1 / r2) * Math.pow(10, t2 - t1);

}

// 乘法
export const accMul = (arg1, arg2) => {

let m = 0;
const s1 = arg1.toString();
const s2 = arg2.toString();
try {
m += s1.split(".")[1].length;
} catch (e) {
}
try {
m += s2.split(".")[1].length;
} catch (e) {
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
// 四舍五入
export const toFixedOptimizing = (current, fractionDigits = 100) => {
// let a = "1";
// for (let i = 0; i ++ ; i >= fractionDigits) {
// a = a + "0";
// console.log("a", a);
// }
// const b = Math.round(current * Number(a)) / Number(a);
const newCurrent = accMul(current, fractionDigits);
const b = Math.round(newCurrent) / fractionDigits;
console.log("a", b, current, newCurrent, fractionDigits);
return b;
};
总体思路就是把小数换算成整数计算,非原创借鉴的链接忘了

posted @ 2020-11-11 21:32  我想去看看。  阅读(211)  评论(0编辑  收藏  举报