123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- let toNonExponential = (num) => {
- var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
- return num.toFixed(Math.max(0, (m[1] || "").length - m[2]));
- };
-
- /**
- * 乘法 - js运算精度丢失问题
- * @param arg1 数1
- * @param arg2 数2
- * 0.0023 * 100 ==> 0.22999999999999998
- * {{ 0.0023 | multiply(100) }} ==> 0.23
- */
- export const floatMultiply = (arg1, arg2) => {
- console.log("==222==");
- arg1 = Number(arg1);
- arg2 = Number(arg2);
- if ((!arg1 && arg1 !== 0) || (!arg2 && arg2 !== 0)) {
- return null;
- }
- arg1 = toNonExponential(arg1);
- arg2 = toNonExponential(arg2);
- let n1, n2;
- let 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);
- };
-
- /**
- * 除法 - js运算精度丢失问题
- * @param arg1 数1
- * @param arg2 数2
- * 0.0023 / 0.00001 ==> 229.99999999999997
- * {{ 0.0023 | divide(0.00001) }} ==> 230
- */
- export const 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);
- let n1, n2;
- let 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));
- // return (n1 / n2) * Math.pow(10, r2 - r1); // 直接乘法还是会出现精度问题
- }
|