Procházet zdrojové kódy

解决 4145474.1249999995 取2位精度的四舍五入问题,版本控制计算。

chenshilong před 2 roky
rodič
revize
b3ff7ca76c

+ 2 - 1
web/building_saas/main/js/models/calc_data_tool.js

@@ -1,4 +1,5 @@
-var historyVer1 = '3000703';
+var historyVer1 = "3000703";
+var historyVer2 = "3000901";
 
 function isLowVer(ver) {
   var fileVer = projectObj.project.projectInfo.fileVer;

+ 47 - 33
web/building_saas/main/js/models/calc_program.js

@@ -393,7 +393,7 @@ let calcTools = {
         result = (result + temp).toDecimal(decimalObj.process);
       }
     }
-    result = result.toDecimal(decimalObj.ration.totalPrice);
+    result = calcTools.digitNum(result, "RT");
     return result;
   },
   // masterTypeFilter 过滤机械机型:[]全部, [1,2]特大机械  [3,4]中小机械。  detailType 如机上人工费、机械折旧费等
@@ -422,7 +422,7 @@ let calcTools = {
         result = (result + (nodeQ * gljQ * mdSum).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
       }
     }
-    result = result.toDecimal(decimalObj.ration.totalPrice);
+    result = calcTools.digitNum(result, "RT");
     return result;
   },
   // 叶子清单、定额、总造价清单的暂估费。(父级清单是汇总子清单的暂估费,走计算程序逻辑,不在这里)
@@ -502,11 +502,11 @@ let calcTools = {
       }
 
       for (let obj of GLJObjs) {
-        let t = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
-        rst.eT = (rst.eT + t).toDecimal(decimalObj.bills.totalPrice);
+        let t = calcTools.digitNum(me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj));
+        rst.eT = calcTools.digitNum(rst.eT + t);
 
-        let tt = (me.uiGLJQty(obj.tenderQuantity) * me.uiGLJPrice(obj.tenderPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
-        rst.eTT = (rst.eTT + tt).toDecimal(decimalObj.bills.totalPrice);
+        let tt = calcTools.digitNum(me.uiGLJQty(obj.tenderQuantity) * me.uiGLJPrice(obj.tenderPrice, obj));
+        rst.eTT = calcTools.digitNum(rst.eTT + tt);
       }
       return rst;
     }
@@ -522,8 +522,8 @@ let calcTools = {
           rst.eTT = (rst.eTT + parseFloatPlus(node.data.feesIndex["estimate"].tenderTotalFee)).toDecimal(decimalObj.process);
         }
       }
-      rst.eT = rst.eT.toDecimal(decimalObj.bills.totalPrice);
-      rst.eTT = rst.eTT.toDecimal(decimalObj.bills.totalPrice);
+      rst.eT = calcTools.digitNum(rst.eT);
+      rst.eTT = calcTools.digitNum(rst.eTT);
       return rst;
     }
     // 先数量乘市场价,再汇总
@@ -589,9 +589,9 @@ let calcTools = {
         sumTT = (sumTT + parseFloatPlus(eTT)).toDecimal(decimalObj.process);
       }
       sumU = sumU.toDecimal(decimalObj.bills.unitPrice);
-      sumT = sumT.toDecimal(decimalObj.bills.totalPrice);
+      sumT = calcTools.digitNum(sumT);
       sumTU = sumTU.toDecimal(decimalObj.bills.unitPrice);
-      sumTT = sumTT.toDecimal(decimalObj.bills.totalPrice);
+      sumTT = calcTools.digitNum(sumTT);
     } else if (me.isParentBill(treeNode)) {
       // 父清单不要汇总单价。
       let eTFBC = eTFeeByChildren();
@@ -620,9 +620,9 @@ let calcTools = {
         }
 
         let q = nodeQ ? nodeQ : 1;
-        sumU = (sumT / q).toDecimal(decimalObj.bills.totalPrice);
+        sumU = calcTools.digitNum(sumT / q);
         let tq = nodeTQ ? nodeTQ : 1;
-        sumTU = (sumTT / tq).toDecimal(decimalObj.bills.totalPrice);
+        sumTU = calcTools.digitNum(sumTT / tq);
       }
     } else if (me.isRationCategory(treeNode)) {
       me.getGLJList(treeNode, false);
@@ -640,8 +640,8 @@ let calcTools = {
         sumT = eTF.eT;
         sumTT = eTF.eTT;
       } else {
-        sumT = (nodeQ * sumU).toDecimal(decimalObj.ration.totalPrice);
-        sumTT = (nodeTQ * sumTU).toDecimal(decimalObj.ration.totalPrice);
+        sumT = calcTools.digitNum(nodeQ * sumU, "RT");
+        sumTT = calcTools.digitNum(nodeTQ * sumTU, "RT");
       }
     }
 
@@ -720,7 +720,7 @@ let calcTools = {
     // 造价书→右键→插入机械:计算程序→机上人工费,多乘了机械的数量。所以这里要加个限制条件。为啥?没搞明白。
     if (!isMachineLabour()) {
       let nodeQ = isTender ? calcTools.uiNodeTenderQty(treeNode) : calcTools.uiNodeQty(treeNode);
-      result = (result * nodeQ).toDecimal(decimalObj.ration.totalPrice);
+      result = calcTools.digitNum(result * nodeQ, "RT");
     }
     return result;
   },
@@ -1163,6 +1163,23 @@ let calcTools = {
       return calcTools.isVP_or_GLJR(node) ? node.data.rationQuantityCoe : node.data.quantityCoe ? node.data.quantityCoe.labour : 0;
     else if (tender == tenderTypes.ttReverseRation) return node.data.rationQuantityCoe;
   },
+  // 先取6位,再取指定精度。解决如下精度问题:
+  // 2022182.5*2.05=4145474.1249999995,结果取2位为 4145474.12。实际期望:
+  // 2022182.5*2.05=4145474.125,结果取2位为 4145474.13。
+  digitNum: function (num, flag) {
+    let digit;
+    if (flag === "RT") digit = decimalObj.ration.totalPrice;
+    else digit = decimalObj.bills.totalPrice;
+
+    let v;
+    if (isLowVer(historyVer2)) {
+      v = scMathUtil.roundForObj(num, digit);
+    } else {
+      v = scMathUtil.roundForObj(num, 6);
+      v = scMathUtil.roundForObj(v, digit);
+    }
+    return v;
+  },
 };
 
 let rationCalcBases = {
@@ -1964,8 +1981,8 @@ class CalcProgram {
           if (treeNode.data.feesIndex && treeNode.data.feesIndex[ft.type]) {
             buf = parseFloatPlus(treeNode.data.feesIndex[ft.type].unitFee).toDecimal(decimalObj.bills.unitPrice);
             btuf = parseFloatPlus(treeNode.data.feesIndex[ft.type].tenderUnitFee).toDecimal(decimalObj.bills.unitPrice);
-            btf = (bq * buf).toDecimal(decimalObj.bills.totalPrice);
-            bttf = (btq * btuf).toDecimal(decimalObj.bills.totalPrice);
+            btf = calcTools.digitNum(bq * buf);
+            bttf = calcTools.digitNum(btq * btuf);
           }
         } else {
           let sum_rtf = 0,
@@ -1978,15 +1995,15 @@ class CalcProgram {
             if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
               ruf = parseFloatPlus(node.data.feesIndex[ft.type].unitFee).toDecimal(decimalObj.bills.unitPrice);
               rtuf = parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee).toDecimal(decimalObj.bills.unitPrice);
-              rtf = parseFloatPlus(node.data.feesIndex[ft.type].totalFee).toDecimal(decimalObj.bills.totalPrice);
-              rttf = parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee).toDecimal(decimalObj.bills.totalPrice);
+              rtf = calcTools.digitNum(parseFloatPlus(node.data.feesIndex[ft.type].totalFee));
+              rttf = calcTools.digitNum(parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee));
             }
 
             sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
             sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
           }
-          btf = sum_rtf.toDecimal(decimalObj.bills.totalPrice);
-          bttf = sum_rttf.toDecimal(decimalObj.bills.totalPrice);
+          btf = calcTools.digitNum(sum_rtf);
+          bttf = calcTools.digitNum(sum_rttf);
           buf = (btf / bq).toDecimal(decimalObj.bills.unitPrice);
           buf = me.billFloatUnitPrice(buf, treeNode);
           btuf = (bttf / btq).toDecimal(decimalObj.bills.unitPrice);
@@ -1996,8 +2013,8 @@ class CalcProgram {
         if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse && ["common", "rationCommon", "indexCommon"].includes(ft.type)) {
           // 招投标项目, 还要反算
           // 9-24 新需求 开放正算反算选项,按选项判断
-          btf = (buf * nQ).toDecimal(decimalObj.bills.totalPrice);
-          bttf = (btuf * nQ).toDecimal(decimalObj.bills.totalPrice);
+          btf = calcTools.digitNum(buf * nQ);
+          bttf = calcTools.digitNum(btuf * nQ);
         }
       }
 
@@ -2043,8 +2060,8 @@ class CalcProgram {
     let tuf = (ttf / tq).toDecimal(decimalObj.bills.unitPrice);
     tuf = me.billFloatUnitPrice(tuf, treeNode);
     if (calcTools.isBillProject()) {
-      tf = (uf * q).toDecimal(decimalObj.bills.totalPrice);
-      ttf = (tuf * q).toDecimal(decimalObj.bills.totalPrice);
+      tf = calcTools.digitNum(uf * q);
+      ttf = calcTools.digitNum(tuf * q);
     }
     let feeItem = {
       fieldName: "common",
@@ -2093,9 +2110,9 @@ class CalcProgram {
         // 修改了清单单价:以单价为准,算金额
         ftObj.unitFee = parseFloatPlus(treeNode.data.feesIndex.common.unitFee);
         // uf = me.billFloatUnitPrice(uf, treeNode); 浮动单价要覆盖原单价。其它类型覆盖了没事,有基础在,还可以算回来。手工输入的不行,一覆盖就从地球上消失了。
-        ftObj.totalFee = (ftObj.unitFee * nQ).toDecimal(decimalObj.bills.totalPrice);
+        ftObj.totalFee = calcTools.digitNum(ftObj.unitFee * nQ);
         ftObj.tenderUnitFee = ftObj.unitFee;
-        ftObj.tenderTotalFee = (ftObj.tenderUnitFee * nTQ).toDecimal(decimalObj.bills.totalPrice);
+        ftObj.tenderTotalFee = calcTools.digitNum(ftObj.tenderUnitFee * nTQ);
       } else if (treeNode.data.calcFlag == treeNodeCalcFlag.customTotalPrice) {
         // 修改了清单金额:以金额为准,算单价。修改了清单数量也一样
         ftObj.totalFee = parseFloatPlus(treeNode.data.feesIndex.common.totalFee);
@@ -2106,8 +2123,8 @@ class CalcProgram {
         ftObj.tenderUnitFee = ftObj.tenderUnitFee.toDecimal(decimalObj.bills.unitPrice);
         if (calcTools.isBillProject()) {
           // 招投标项目, 还要反算
-          ftObj.totalFee = (ftObj.unitFee * nQ).toDecimal(decimalObj.bills.totalPrice);
-          ftObj.tenderTotalFee = (ftObj.tenderUnitFee * nTQ).toDecimal(decimalObj.bills.totalPrice);
+          ftObj.totalFee = calcTools.digitNum(ftObj.unitFee * nQ);
+          ftObj.tenderTotalFee = calcTools.digitNum(ftObj.tenderUnitFee * nTQ);
         }
       }
       calcTools.checkFeeField(treeNode, ftObj);
@@ -2145,13 +2162,10 @@ class CalcProgram {
     let nTQ = calcTools.uiNodeTenderQty(treeNode) ? calcTools.uiNodeTenderQty(treeNode) : 1;
 
     if (treeNode.calcType == treeNodeCalcType.ctRationCalcProgram) {
-      debugger;
       // 量价、工料机类型的定额要求"市场合价"
       if (calcTools.isVP_or_GLJR(treeNode)) {
         let u = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
-        // 先取6位,再取2位。解决 4145474.1249999995 四舍五入问题。
-        let t = scMathUtil.roundForObj(u * nQ, 6);
-        t = scMathUtil.roundForObj(t, decimalObj.ration.totalPrice);
+        let t = calcTools.digitNum(u * nQ, "RT");
         if (treeNode.data.marketTotalFee != t) {
           treeNode.data.marketTotalFee = t;
           treeNode.changed = true;