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 相关文章推荐
jQuery实现多按钮单击变色
Nov 27 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
Oct 29 Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
javascript流程控制语句集合
Sep 18 Javascript
解决vue处理axios post请求传参的问题
Mar 05 Javascript
浅谈vue中.vue文件解析流程
Apr 24 Javascript
详解node.js的http模块实例演示
Jul 12 Javascript
小程序如何使用分包加载的实现方法
May 22 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 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
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
innerText 使用示例
2014/01/23 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
js实现移动端轮播图
2020/12/21 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
使用python存储网页上的图片实例
2018/05/22 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
优秀求职信范文分享
2013/12/19 职场文书
学年自我鉴定
2014/01/16 职场文书
科研先进个人典型材料
2014/01/31 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
Django中session进行权限管理的使用
2021/07/09 Python
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技