公共类, 将科学计数法的数字转为字符串(以下加减乘除依赖该方法)
var toNonExponential = (num)=> {if(num == null) {return num;}if(typeof num == "number") {var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);return num.toFixed(Math.max(0, (m[1] || '').length - m[2]));}else {return num;}}
乘(以下加减除依赖该方法)
var floatMultiply = (arg1, arg2) => {arg1 = Number(arg1);arg2 = Number(arg2);if ((!arg1 && arg1!==0) || (!arg2 && arg2!==0)) {return null;}arg1 = toNonExponential(arg1);arg2 = toNonExponential(arg2);var n1, n2;var r1, r2; // 小数位数try {r1 = arg1.toString().split(".")[1].length;} catch (e) {r1 = 0;}try {r2 = arg2.toString().split(".")[1].length;} catch (e) {r2 = 0;}n1 = Number(arg1.toString().replace(".", ""));n2 = Number(arg2.toString().replace(".", ""));return n1 * n2 / Math.pow(10, r1 + r2);
}
除
var floatDivide = (arg1, arg2) => {arg1 = Number(arg1);arg2 = Number(arg2);if (!arg2) {return null;}if (!arg1 && arg1!==0) {return null;}else if(arg1===0) {return 0;}arg1 = toNonExponential(arg1);arg2 = toNonExponential(arg2);var n1, n2;var r1, r2; // 小数位数try {r1 = arg1.toString().split(".")[1].length;} catch (e) {r1 = 0;}try {r2 = arg2.toString().split(".")[1].length;} catch (e) {r2 = 0;}n1 = Number(arg1.toString().replace(".", ""));n2 = Number(arg2.toString().replace(".", ""));return floatMultiply((n1 / n2), Math.pow(10, r2 - r1));
}
加
var floatAdd = (arg1, arg2) => {arg1 = Number(arg1) || 0;arg2 = Number(arg2) || 0;arg1 = toNonExponential(arg1);arg2 = toNonExponential(arg2);var r1, r2, m;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 (floatMultiply(arg1, m) + floatMultiply(arg2, m)) / m;
}
减
var floatSub = (arg1, arg2) => {arg1 = Number(arg1) || 0;arg2 = Number(arg2) || 0;arg1 = toNonExponential(arg1);arg2 = toNonExponential(arg2);var r1, r2, m, n;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));// 动态控制精度长度n = (r1 >= r2) ? r1 : r2;return ((floatMultiply(arg1, m) - floatMultiply(arg2, m)) / m).toFixed(n);
}
参考:https://blog.csdn.net/ycclydy/article/details/123580326