`

js浮点运算bug的解决办法

阅读更多

一、事件        最近在做项目的管理费,在客户端用js写的。发现了一个重大问题,比如0.7*8.1=5.6699999999,10.3-9.2=1.100000000014.为什么会出现这些问题呢?难道是js对浮点数运算的bug?该怎么办? 二、响应      “内事不决问百度,外事不决问google”啊,上网查找资料,证实了我的想法,也找到了解决方案。同时我也有了自己的解决方案。      1、网上解决方案是对浮点数的运算做了类似重写,代码如下:(转载)

//除法函数,用来得到精确的除法结果
//说明: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 ((arg2*m-arg1*m)/m).toFixed(n);
}
///给number类增加一个sub方法,调用起来更加方便
Number.prototype.sub = function (arg){
 return accSub(arg,this);
}

    这样,如果你要计算0.7*8.1 只需(0.7).mul(8.1)调用mul方法就可以得到准确的答案。     2、我的解决方案     这不失为一种好方法,然而,我想将浮点型转化为整形后再做运算也是解决的一种方法。如0.7*8.1,我们可以这么算(0.7*10)*(8.1*10)/100,结果为5.67,显然是可以的。又通过项目的实践,都能得出准确的结果。 三、总结:      1、尽量不要用JS做复杂的运算,特别是浮点数的运算。      2、如果一定要进行浮点数的运算的话,先将浮点数转化为整形,再运算。 摘自:http://www.cnblogs.com/jiahaipeng/archive/2008/10/29/1321821.html

 

 

本文来源于:http://www.thinksaas.cn/group/topic/272358/

分享到:
评论

相关推荐

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

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

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

    本篇文章主要是对js中浮点型运算BUG的解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    js中浮点类型数据的计算

     我Google了一下,发现原来这是JavaScript浮点运算的一个bug。  比如:7*0.8 JavaScript算出来就是:5.6000000000000005  网上找到了一些解决办法,就是重新写了一些浮点运算的函数。  下面就把这些方法摘录...

    解决JS浮点数运算出现Bug的方法

    我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 网上找到了一些解决办法,就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些...

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

    我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...

    浅析js中的浮点型运算问题

    到网上一搜,有网友说这是一个JS浮点数运算Bug,找了解决方法: 方法一:有js自定义函数 代码如下:[removed] //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会...

    浮点数加减乘除运算

    浮点数加减乘除运算,里面结合了从网上搜索到的accAdd版本以及新增版本的浮点加减乘除运算,明显能直出新补充方法能满足实际需求,解决js对于浮点运算的bug.

    JS浮点数运算结果不精确的Bug解决

    最近在做项目的时候,涉及到产品价格的计算,经常会出现JS浮点数精度问题,这个问题,对于财务管理系统的开发者来说,是个非常严重的问题(涉及到钱相关的问题都是严重的问题),这里把相关的原因和问题的解决方案...

    鬼鬼JS调试工具7.5

    因用发条js1.9,中文会出现乱码,用鬼鬼的就可以,发现本坛上只有7.0,其他地方找到了7.5的,给有需要的人下载。以下内容为转载: 鬼鬼JS调试工具,就如软件名说的那样,辅Zhu...解决某些浮点类型的运算结果不正确。

    详解JS– 浮点数运算处理

    最近在做一个项目,页面上会存在一些JS浮点数的运算,发现JS浮点数运算存在一些bug.譬如: 0.1+0.2 == 0.30000000000000004 0.1 + 0.7 == 0.7999999999999999 7*0.8 == 5.6000000000000005 5.6/7 == 0....

    帮助避免错误的Javascript陷阱清单

    1.浮点运算 这可能是挫败一些对javascript不熟悉并准备执行一些数学运算的人的主要原因. [removed]  alert(0.02 / 0.1); //0.19999999999999998  alert(1.14 * 100); //113.999

    安卓计算器源代码

    但是2.3.3存在Bug,Js调用Java会导致程序崩溃, 所以没办法,最后是用 BeanShell来解析的。 不过,因为需要每个参与计算的数字都是浮点型, 才能正确无误的保留精度,因为我正则不行,过滤表达式还是花了点功夫 ...

Global site tag (gtag.js) - Google Analytics