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 相关文章推荐
JavaScript中的私有成员
Sep 18 Javascript
Javascript 判断Flash是否加载完成的代码
Apr 12 Javascript
基于jQuery试卷自动排版系统
Jul 18 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
Nov 18 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
AngularJS基础 ng-repeat 指令简单示例
Aug 03 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
Dec 06 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
Vue高版本中一些新特性的使用详解
Sep 25 Javascript
详解在Javascript中进行面向切面编程
Apr 28 Javascript
原生JS运动实现轮播图
Jan 02 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下intval()和(int)转换使用与区别
2008/07/18 PHP
php 分页原理详解
2009/08/21 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
javascript json 新手入门文档
2009/12/03 Javascript
js确定对象类型方法
2012/03/30 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
python修改操作系统时间的方法
2015/05/18 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python如何使用腾讯云发送短信
2020/09/17 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
会话Bean的种类
2013/11/07 面试题
EJB的角色和三个对象
2015/12/31 面试题
房地产出纳岗位职责
2013/12/01 职场文书
大学运动会通讯稿
2014/01/28 职场文书
优秀教师主要事迹
2014/02/01 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
晚归检讨书
2014/02/19 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
个人年度总结报告
2015/03/09 职场文书
2016新年感言
2015/08/03 职场文书