js 计算精度问题
2016-05-23 17:10
405 查看
js浮点型四舍五入的方法:toFixed(arg); 传入的参数就是要保留的小数位数
最近做系统时,发现了一个JS在计算方面的问题:
如18.2 * 2 = 36.4
但如果18.2*3 = 54.599999999999994
很奇怪,不知道为什么,在网上搜了一下有人说这是JS的一个BUG,
对于加、乘、除都会有影响
可以写个函数进行处理
分别写成如下的操作:
//加法函数,用来得到精确的加法结果
//说明: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);
}
//乘法函数,用来得到精确的乘法结果
//说明: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)
}
//除法函数,用来得到精确的除法结果
//说明: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);
}
}
最近做系统时,发现了一个JS在计算方面的问题:
如18.2 * 2 = 36.4
但如果18.2*3 = 54.599999999999994
很奇怪,不知道为什么,在网上搜了一下有人说这是JS的一个BUG,
对于加、乘、除都会有影响
可以写个函数进行处理
分别写成如下的操作:
//加法函数,用来得到精确的加法结果
//说明: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);
}
//乘法函数,用来得到精确的乘法结果
//说明: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)
}
//除法函数,用来得到精确的除法结果
//说明: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);
}
}
相关文章推荐
- JavaScript 跨域访问的问题和解决过程
- 详解JavaScript中|单竖杠运算符的使用方法
- js实现放大缩小页面
- json解析中 opt和get的区别
- bzoj 4466 : [Jsoi2013]超立方体
- 使用bookshelf.js进行left join操作
- JSP
- javascript类学习(二)——类的私有变量、私有方法、共有变量、共有方法
- 关于Chrome调试中.min.js.map 404的问题
- JSON.stringify()、,JSON.eval(),JSON.parse()各自的区别于作用
- js提示确认删除吗
- Javascript的this用法
- js获取url参数,操作url参数
- 使用JavaScript进行进制转换将字符串转换为十进制
- javascript类学习(一)——构造器与原型链实现简单的继承
- json解析总结
- js 自定义弹出框
- JS实现字体逐个显示
- 从服务器下载&&OTA升级&&JSON文件解析
- JSP空指针异常问题