jQuery MiniUI

标题: grid.updateRow()更新行后,数字列精度丢失 [打印本页]

作者: xerxesweirdo    时间: 2017-12-19 10:59:42     标题: grid.updateRow()更新行后,数字列精度丢失


功能是grid中有两列是可编辑的列,SUM_列不可编辑值不变,修改PRINCIPAL或INPUTTAXSUM其中一列的数值,另一可编辑列数值自动计算为SUM_-PRINCIPAL或SUM_-INPUTTAXSUM。

现在出现的问题是,会出现修改某一列数值后,grid.updateRow()后,界面的SUM_值出现类似

46.010000000000005

的情况

js调试会发现在grid.updateRow()之前数字都是正常的。



作者: xerxesweirdo    时间: 2017-12-19 11:00:46

js——>
function principalChanged(e){
        var principal = e.value;
        var row = grid.getSelected();
        var sum = row.SUM_;
        var inputTaxSum = accSub(sum,principal);
        var newRow = row;
        newRow.INPUTTAXSUM = inputTaxSum;
        grid.updateRow(row,newRow);
}
function inputTaxSumChanged(e){
        var inputTaxSum = e.value
        ;
        var row = grid.getSelected();
        var sum = row.SUM_;
        var principal = accSub(sum,inputTaxSum);
        var newRow = row;
        newRow.PRINCIPAL = principal;
        grid.updateRow(row,newRow);
}
function accSub(arg1,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));
          //last modify by deeka
          //动态控制精度长度
          n=(r1>=r2)?r1:r2;
          return ((arg1*m-arg2*m)/m).toFixed(n);
}


作者: felt    时间: 2017-12-19 11:19:44

xerxesweirdo 发表于 2017-12-19 11:00
js——>
function principalChanged(e){
        var principal = e.value;

1 首先js的浮点数计算本身是由问题的
2 做成一个简单的html页面发上来,回复高级模式可以上传文件。
作者: xerxesweirdo    时间: 2017-12-19 11:27:58

felt 发表于 2017-12-19 11:19
1 首先js的浮点数计算本身是由问题的
2 做成一个简单的html页面发上来,回复高级模式可以上传文件。 ...

附件是html代码

作者: xerxesweirdo    时间: 2017-12-19 11:29:53

felt 发表于 2017-12-19 11:19
1 首先js的浮点数计算本身是由问题的
2 做成一个简单的html页面发上来,回复高级模式可以上传文件。 ...

js精度问题已经规避了,自定义的减法是先转换成整数,再计算减法,再tofixed
关键是debug js时候发现gird.updateRow之前的变量都是正常的。所以可能原因是不是我的html属性问题,或者updateRow的处理方式问题
作者: felt    时间: 2017-12-19 12:43:20

xerxesweirdo 发表于 2017-12-19 11:29
js精度问题已经规避了,自定义的减法是先转换成整数,再计算减法,再tofixed
关键是debug js时候发现gird ...

http://www.miniui.com/demo/#src=datagrid/drawcell2.html
你参考一下我们绘制的示例吧,可以用绘制来实现的。
function onDrawCell(e) {
            var record = e.record;

            if (e.field == "total") {
                var price = record.price;
                var quantity = record.quantity;
                e.cellHtml = price * quantity;
                e.record.total=price * quantity;
            }

        }

作者: xerxesweirdo    时间: 2017-12-19 15:29:10

felt 发表于 2017-12-19 12:43
http://www.miniui.com/demo/#src=datagrid/drawcell2.html
你参考一下我们绘制的示例吧,可以用绘制来实 ...

谢谢,问题解决了,不是miniUI的问题,其他地方的代码影响到了这里。
不好意思,再次感谢版主的耐心解答
作者: vtjj3213    时间: 2018-1-9 16:53:22

xerxesweirdo 发表于 2017-12-19 15:29
谢谢,问题解决了,不是miniUI的问题,其他地方的代码影响到了这里。
不好意思,再次感谢版主的耐心解答 ...

其实转化不是绝对的,加减乘除都是有精度问题的。你的加法转化函数里面肯定用了乘法,减法转化函数肯定用了除法,乘法转换函数肯定用了加法,除法转换函数肯定用了减法,所以无法完全避免




欢迎光临 jQuery MiniUI (http://miniui.com/discuss/) Powered by Discuz! X2