js中Number数字数值运算后值不对的解决方法


Posted in Javascript onFebruary 28, 2017

问题:

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)

我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998

怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。

我Google了一下,发现原来这是JavaScript浮点运算的一个bug。

比如:7*0.8 JavaScript算出来就是:5.6000000000000005

解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。

下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

程序代码

//除法函数,用来得到精确的除法结果
//说明: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 (r1/r2)*pow(10,t2-t1);
 }
}

//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
 return accDiv(this, arg);
}

//乘法函数,用来得到精确的乘法结果
//说明: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)
}

//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
 return accMul(arg, this);
}

//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1,arg2){
 var r1,r2,m;
 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))
 return (arg1*m+arg2*m)/m
}

//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg){
 return accAdd(arg,this);
}

减法函数

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);
}

在你要用的地方包含这些函数,然后调用它来计算就可以了。

比如你要计算:7*0.8 ,则改成 (7).mul(8)

其它运算类似,就可以得到比较精确的结果。

以上这篇js中Number数字数值运算后值不对的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
彻底搞懂JS无缝滚动代码
Jan 03 Javascript
学习YUI.Ext第五日--做拖放Darg&Drop
Mar 10 Javascript
用js实现的抽象CSS圆角效果!!
May 03 Javascript
jQuery Ajax请求状态管理器打包
May 03 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
Oct 05 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
使用jQuery实现购物车结算功能
Aug 15 jQuery
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
Vue完整项目构建(进阶篇)
Feb 10 Javascript
js监听html页面的上下滚动事件方法
Sep 11 Javascript
我所理解的JavaScript中的this指向
Sep 04 Javascript
canvas绘图不清晰的解决方案
Feb 28 #Javascript
jQuery树控件zTree使用方法详解(一)
Feb 28 #Javascript
js数字计算 误差问题的快速解决方法
Feb 28 #Javascript
js数字舍入误差以及解决方法(必看篇)
Feb 28 #Javascript
JS实现浏览器打印、打印预览示例
Feb 28 #Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 #Javascript
js中删除数组中的某一元素实例(无下标时)
Feb 28 #Javascript
You might like
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
vue 清空input标签 中file的值操作
2020/07/21 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
python内存管理分析
2015/04/08 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
django缓存配置的几种方法详解
2018/07/16 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
Python线程之定位与销毁的实现
2019/02/17 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
宣传保护环境的公益广告词
2014/03/13 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
七年级数学教学反思
2016/02/17 职场文书