jQuery MiniUI

 找回密码
 立即注册
查看: 3464|回复: 7
打印 上一主题 下一主题

grid.updateRow()更新行后,数字列精度丢失 [复制链接]

Rank: 2

跳转到指定楼层
楼主
发表于 2017-12-19 10:59:42 |只看该作者 |倒序浏览

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

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

46.010000000000005

的情况

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


Rank: 2

沙发
发表于 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);
}

Rank: 8Rank: 8

板凳
发表于 2017-12-19 11:19:44 |只看该作者
xerxesweirdo 发表于 2017-12-19 11:00
js——>
function principalChanged(e){
        var principal = e.value;

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

Rank: 2

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

附件是html代码
附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册

Rank: 2

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

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

Rank: 8Rank: 8

6#
发表于 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;
            }

        }

Rank: 2

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

谢谢,问题解决了,不是miniUI的问题,其他地方的代码影响到了这里。
不好意思,再次感谢版主的耐心解答

Rank: 3Rank: 3

8#
发表于 2018-1-9 16:53:22 |只看该作者
xerxesweirdo 发表于 2017-12-19 15:29
谢谢,问题解决了,不是miniUI的问题,其他地方的代码影响到了这里。
不好意思,再次感谢版主的耐心解答 ...

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

Archiver|普加软件

GMT+8, 2024-10-6 10:26 , Processed in 1.035519 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部