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