From 298de8a7253b46a4352f9b63f9b3bef7541faca3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E5=A4=A9=E9=9C=B8?= <15565133664@163.com>
Date: Fri, 2 Sep 2022 17:21:45 +0800
Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E5=BA=A6=E4=B8=A2=E5=A4=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main.js                          |   3 +
 src/utils/calculation.js             | 115 +++++++++++++++++++++++++++
 src/utils/index.js                   |   1 +
 src/views/system/goods/add/index.vue |  23 +++---
 4 files changed, 131 insertions(+), 11 deletions(-)
 create mode 100644 src/utils/calculation.js

diff --git a/src/main.js b/src/main.js
index 6f43268..3e5ece5 100644
--- a/src/main.js
+++ b/src/main.js
@@ -51,6 +51,9 @@ Vue.prototype.msgError = function (msg) {
 Vue.prototype.msgInfo = function (msg) {
   this.$message.info(msg);
 }
+//乘法精度丢失
+import cal from '@/utils/calculation';
+Vue.prototype.cal = cal
 
 // 动态修改meta
 import MetaInfo from 'vue-meta-info'
diff --git a/src/utils/calculation.js b/src/utils/calculation.js
new file mode 100644
index 0000000..1316168
--- /dev/null
+++ b/src/utils/calculation.js
@@ -0,0 +1,115 @@
+var countDecimals = function(num) {    
+    var len = 0;    
+    try {        
+        num = Number(num);        
+        var str = num.toString().toUpperCase();        
+        if (str.split('E').length === 2) {             
+            var isDecimal = false;            
+            if (str.split('.').length === 2) {                
+                str = str.split('.')[1];                
+                if (parseInt(str.split('E')[0]) !== 0) {                    
+                    isDecimal = true;                
+                }            
+            }            
+            let x = str.split('E');            
+            if (isDecimal) {                
+                len = x[0].length;            
+            }            
+            len -= parseInt(x[1]);        
+        } else if (str.split('.').length === 2) {           
+            if (parseInt(str.split('.')[1]) !== 0) {                
+                len = str.split('.')[1].length;            
+            }        
+        }    
+    } catch (e) {        
+        throw e;    
+    } finally {        
+        if (isNaN(len) || len < 0) {            
+            len = 0;        
+        }        
+        return len;    
+    }
+}; 
+var convertToInt = function(num) {    
+    num = Number(num);    
+    var newNum = num;    
+    var times = countDecimals(num);    
+    var temp_num = num.toString().toUpperCase();    
+    if (temp_num.split('E').length === 2) {        
+        newNum = Math.round(num * Math.pow(10, times));    
+    } else {        
+        newNum = Number(temp_num.replace(".", ""));    
+    }    
+    return newNum;
+}; 
+var getCorrectResult = function(type, num1, num2, result) {    
+    var temp_result = 0;    
+    switch (type) {        
+        case "add":            
+            temp_result = num1 + num2;            
+            break;        
+        case "sub":            
+            temp_result = num1 - num2;            
+            break;        
+        case "div":            
+            temp_result = num1 / num2;            
+            break;        
+        case "mul":            
+            temp_result = num1 * num2;            
+            break;    
+    }    
+    if (Math.abs(result - temp_result) > 1) {        
+        return temp_result;    
+    }    
+    return result;
+};
+export default {    
+    //加法    
+    accAdd(num1, num2) {        
+        num1 = Number(num1);        
+        num2 = Number(num2);        
+        var dec1, dec2, times;        
+        try { dec1 = countDecimals(num1) + 1; } catch (e) { dec1 = 0; }        
+        try { dec2 = countDecimals(num2) + 1; } catch (e) { dec2 = 0; }        
+        times = Math.pow(10, Math.max(dec1, dec2));        
+        var result = (this.accMul(num1, times) + this.accMul(num2, times)) / times;        
+        return getCorrectResult("add", num1, num2, result);    
+    },    
+    //减法    
+    accSub(num1, num2) {        
+        num1 = Number(num1);        
+        num2 = Number(num2);        
+        var dec1, dec2, times;        
+        try { dec1 = countDecimals(num1) + 1; } catch (e) { dec1 = 0; }        
+        try { dec2 = countDecimals(num2) + 1; } catch (e) { dec2 = 0; }        
+        times = Math.pow(10, Math.max(dec1, dec2));        
+        var result = Number((this.accMul(num1, times) - this.accMul(num2, times)) / times);        
+        return getCorrectResult("sub", num1, num2, result);    
+    },    
+    //除法    
+    accDiv(num1, num2) {        
+        num1 = Number(num1);        
+        num2 = Number(num2);        
+        var t1 = 0,            
+            t2 = 0,            
+            dec1, dec2;        
+        try { t1 = countDecimals(num1); } catch (e) {}        
+        try { t2 = countDecimals(num2); } catch (e) {}        
+        dec1 = convertToInt(num1);        
+        dec2 = convertToInt(num2);        
+        var result = this.accMul((dec1 / dec2), Math.pow(10, t2 - t1));        
+        return getCorrectResult("div", num1, num2, result);    
+    },    
+    //乘法    
+    accMul(num1, num2) {        
+        num1 = Number(num1);        
+        num2 = Number(num2);        
+        var times = 0,            
+            s1 = num1.toString(),            
+            s2 = num2.toString();        
+        try { times += countDecimals(s1); } catch (e) {}        
+        try { times += countDecimals(s2); } catch (e) {}        
+        var result = convertToInt(s1) * convertToInt(s2) / Math.pow(10, times);        
+        return getCorrectResult("mul", num1, num2, result);    
+    }
+}
\ No newline at end of file
diff --git a/src/utils/index.js b/src/utils/index.js
index 9bce8c0..59694bf 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -422,3 +422,4 @@ export function camelCase(str) {
 export function isNumberStr(str) {
   return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
 }
+
diff --git a/src/views/system/goods/add/index.vue b/src/views/system/goods/add/index.vue
index 4de6ea3..a8029f3 100644
--- a/src/views/system/goods/add/index.vue
+++ b/src/views/system/goods/add/index.vue
@@ -121,7 +121,6 @@
   import GoodsParameter from './components/goodsparameter';
   import Goodsimg from './components/goodsimg2';
   import Goodsaftersale from './components/goodsaftersale';
-
   export default {
     name: 'Index',
     components: {
@@ -702,7 +701,7 @@
             this.goodsAllData.ladder = ladder
             // 进一步处理金额数据
             this.goodsAllData.ladder.map((item)=> {
-              item.money = item.money * 10000 / 100
+              item.money = formatNumber(item.money*100)
               return item
             });
           }
@@ -743,7 +742,7 @@
 
         // 所有数据合并
         Object.assign( this.goodsAllData, spxxData, spsjData, ssffData);
-
+debugger
         this.goodsAllData.description = spxqData
 
         // 经营类目,服务标签,需要单独处理数据格式
@@ -756,10 +755,11 @@
         // 价格数字需要 乘以100
         if(this.goodsAllData.specs_group && this.goodsAllData.specs_group.length > 0) {
           this.goodsAllData.specs_group.forEach((item)=> {
-            item.sc_price = (Number(item.sc_price) * 1000)/10;
-            item.price = (Number(item.price) * 1000)/10;
-            item.js_price = (Number(item.js_price) * 1000)/10;
-            item.prime_cost = (Number(item.prime_cost) * 1000)/10;
+            item.sc_price = Number(this.cal.accMul(item.sc_price,100));
+            item.price = Number(this.cal.accMul(item.price,100)) ;
+            item.js_price = Number(this.cal.accMul(item.js_price,100));
+            debugger
+            item.prime_cost = Number(this.cal.accMul(item.prime_cost,100));
             item.stock = Number(item.stock);
             item.stock_warning = Number(item.stock_warning);
             item.bar_code = Number(item.bar_code);
@@ -771,10 +771,11 @@
           delete this.goodsAllData.stock;
           delete this.goodsAllData.weight;
         }else {
-          this.goodsAllData.sc_price = (Number(this.goodsAllData.sc_price) * 1000)/10
-          this.goodsAllData.price = (Number(this.goodsAllData.price) * 1000)/10
-          this.goodsAllData.js_price = (Number(this.goodsAllData.js_price) * 1000)/10
-          this.goodsAllData.prime_cost = (Number(this.goodsAllData.prime_cost) * 1000)/10
+          this.goodsAllData.sc_price = Number(this.cal.accMul(this.goodsAllData.sc_price,100)) 
+          this.goodsAllData.price = Number(this.cal.accMul(this.goodsAllData.price,100))
+          this.goodsAllData.js_price = Number(this.cal.accMul(this.goodsAllData.js_price,100))
+          debugger
+          this.goodsAllData.prime_cost = Number(this.cal.accMul(this.goodsAllData.prime_cost,100)) 
           this.goodsAllData.stock = Number(this.goodsAllData.stock);
           this.goodsAllData.stock_warning = Number(this.goodsAllData.stock_warning);
           this.goodsAllData.bar_code = Number(this.goodsAllData.bar_code);
-- 
2.18.1