js中浮点型运算BUG的解决方法说明


Posted in Javascript onJanuary 06, 2014

曾经项目用到过的,之前在网上找到此代码,但在特定条件下除法和加法运算依然会出现BUG个人对此稍作优化

//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
        return accMul((r1 / r2),pow(10, t2 - t1));
    }
}

//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

//加法运算中级解决办法
function accAdd(arg1, arg2) {   
    var r1, r2, m, c;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }  
    c = Math.abs(r1 - r2);   
    m = Math.pow(10, Math.max(r1, r2))   
    if (c > 0) {   
        var cm = Math.pow(10, c);   
        if (r1 > r2) {   
            arg1 = Number(arg1.toString().replace(".", ""));   
            arg2 = Number(arg2.toString().replace(".", "")) * cm;   
        }   
        else {   
            arg1 = Number(arg1.toString().replace(".", "")) * cm;   
            arg2 = Number(arg2.toString().replace(".", ""));   
        }   
    }   
    else {   
        arg1 = Number(arg1.toString().replace(".", ""));   
        arg2 = Number(arg2.toString().replace(".", ""));   
    }   
    return accDiv((arg1 + arg2),m); 
}
Javascript 相关文章推荐
动态加载iframe
Jun 16 Javascript
JS 判断代码全收集
Apr 28 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
jquery拖动插件(jquery.drag)使用介绍
Jun 18 Javascript
jquery.qrcode在线生成二维码使用示例
Aug 21 Javascript
JQuery中使用.each()遍历元素学习笔记
Nov 08 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
Apr 21 Javascript
微信小程序 如何引入外部字体库iconfont的图标
Jan 31 Javascript
layui使用label标签的方法
Sep 14 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
Aug 19 Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 Javascript
uniapp引入支付宝原生扫码插件步骤详解
Jul 23 Javascript
Jquery操作radio的简单实例
Jan 06 #Javascript
jQuery选择器全面总结
Jan 06 #Javascript
JavaScript定义类的几种方式总结
Jan 06 #Javascript
javascript函数定义的几种区别小结
Jan 06 #Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 #Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 #Javascript
JavaScript将数据转换成整数的方法
Jan 04 #Javascript
You might like
牡丹941资料
2021/03/01 无线电
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Python操作Excel之xlsx文件
2017/03/24 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
使用Python读取大文件的方法
2018/02/11 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
营销与策划个人求职信
2013/09/22 职场文书
网络教育毕业生自我鉴定
2013/10/10 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
授权委托书样本
2014/04/03 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
论文答辩开场白大全
2015/05/27 职场文书
小学新课改心得体会
2016/01/22 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
python实现自动化群控的步骤
2021/04/11 Python