html Js大值传递时的精度不准确问题记录

原创
04/29 12:01
阅读数 150

情景再现:

环境:游戏后台开发
开发配置:php ,html,js
任务:在后台,可以根据道具key删除玩家的道具,不管玩家在线不在线都可以

开发过程:

源码:

<td><input type="button" value="删除" onclick="return delete_item(this,'{$row[item_key]}',{$row[item_num]},{$row[item_id]},{$params['pkey']})" /></td>        

<script type="text/javascript">
function delete_item(a, ikey, inum, id, pkey) {
    if (!confirm("你确定需要删除物品,删除后无法恢复哦!!")) {
        layer.msg('不删了...');
        return false;
    }
	$.post('?m=S_TEST_DEL&act=del_item',{ikey:ikey,inum:inum,pkey:pkey,id:id},function(data){
                        if (data.state == '1') {
                            layer.msg(data.msg);
                            setTimeout(function(){
                            	location.href = '?m=S_TEST_DEL&pkey=' + pkey;
                            },3000);
                        }else{
                            layer.alert(data.msg);
                        }        
                },'json');
};
</script>

上面的代码表明,设置了删除按钮,按钮执行delete_item函数,此处注意:$row[item_key] 所代表的值是:10010000000068313,这个值的长度是17位,读作:1亿亿6万8千3百1十3,但是,如果在js的函数delete_item所获取的ikey值为:10010000000068312,当时看到这个数值,我惊呆了,首先怀疑是不是代码写错了,我通过查看网页源码发现,数值的显示没有问题呀,设置断点跟进,发现总是在delete_item的时候,ikey值就是不对,值为什么传输的时候变掉了呢?在哪里变掉的?值在传输的时候被覆盖了?整个问题,困扰了我好几个小时,详细的查代码,详细的捋逻辑,一步一步的设置断点,都没有发现问题。这到底是怎么回事,为什么值会变掉?

解决过程

资讯同事,告诉他我的代码设计,以及出现的问题,经过共同查看代码和逻辑,确定代码和逻辑设计是没有问题的,最后,在网上找到了一个解决方案:可能是因为大数值的进度问题导致。进过验证(验证方法:任意打开一个网页的控制台,复制大数,查看输出,确实是变掉了),确定是大数值问题,在js传输过程中,导致了精度不准确的问题。所以根据实际情况,采用字符串的方式传值,后续证明,是可行的,并且可保证数值正确。

总结

  • 1.遇到问题,详细的检查代码逻辑和设计,保证正确性
  • 2.遇到比较棘手的问题,一定要有一个良好的心态,不急不燥,有耐心的解决问题
  • 3.遇到棘手的问题,长时间都解决不了,那就先放一放,明天看,后者过会看,思路反而会比较清晰
  • 4.遇到棘手,长时间都解决不了的问题,一定要求助别人,说不定,大家一讨论,问题就很快被解决了,这是这次比较深刻的体悟,并且这个也非常重要和有必要

其他问题

  • 1.$.post()的时候总是接收不到,应该是哪里的语法错误导致
  • 2.物品删除之后,刷新网页,物品竟然还在,但是实际中玩家物品已经不存在,查看代码,是因为设置了3s的道具刷新入库

参考链接

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部