Heim >Web-Frontend >js-Tutorial >浅析js中的浮点型运算问题_javascript技巧

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

WBOY
WBOYOriginal
2016-05-16 17:05:181000Durchsuche

js中浮点型是如何运算的呢?

例如:var a=0.69;

我想得到6.9 直接这样写 var c=a*10;

alert(c);   得到结果是:6.8999999999999995

到网上一搜,有网友说这是一个JS浮点数运算Bug,找了解决方法:

方法一:有js自定义函数

复制代码 代码如下:

<script> <P>//加法函数,用来得到精确的加法结果 <BR>//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 <BR>//调用:accAdd(arg1,arg2) <BR>//返回值:arg1加上arg2的精确结果 <BR>function accAdd(arg1,arg2){ <BR>var r1,r2,m; <BR>try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} <BR>try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} <BR>m=Math.pow(10,Math.max(r1,r2)) <BR>return (arg1*m+arg2*m)/m <BR>} <BR>//给Number类型增加一个add方法,调用起来更加方便。 <BR>Number.prototype.add = function (arg){ <BR>return accAdd(arg,this); <BR>} <P>//加法函数,用来得到精确的加法结果 <BR>//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 <BR>//调用:accAdd(arg1,arg2) <BR>//返回值:arg1加上arg2的精确结果 <BR>function accSub(arg1,arg2){<BR> var r1,r2,m,n;<BR> try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}<BR> try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}<BR> m=Math.pow(10,Math.max(r1,r2));<BR> //last modify by deeka<BR> //动态控制精度长度<BR> n=(r1>=r2)?r1:r2;<BR> return ((arg1*m-arg2*m)/m).toFixed(n);<BR>} <P>//除法函数,用来得到精确的除法结果 <BR>//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 <BR>//调用:accDiv(arg1,arg2) <BR>//返回值:arg1除以arg2的精确结果 <BR>function accDiv(arg1,arg2){ <BR>var t1=0,t2=0,r1,r2; <BR>try{t1=arg1.toString().split(".")[1].length}catch(e){} <BR>try{t2=arg2.toString().split(".")[1].length}catch(e){} <BR>with(Math){ <BR>r1=Number(arg1.toString().replace(".","")) <BR>r2=Number(arg2.toString().replace(".","")) <BR>return (r1/r2)*pow(10,t2-t1); <BR>} <BR>} <BR>//给Number类型增加一个div方法,调用起来更加方便。 <BR>Number.prototype.div = function (arg){ <BR>return accDiv(this, arg); <BR>} <P>//乘法函数,用来得到精确的乘法结果 <BR>//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 <BR>//调用:accMul(arg1,arg2) <BR>//返回值:arg1乘以arg2的精确结果 <BR>function accMul(arg1,arg2) <BR>{ <BR>var m=0,s1=arg1.toString(),s2=arg2.toString(); <BR>try{m+=s1.split(".")[1].length}catch(e){} <BR>try{m+=s2.split(".")[1].length}catch(e){} <BR>return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) <BR>} <BR>//给Number类型增加一个mul方法,调用起来更加方便。 <BR>Number.prototype.mul = function (arg){ <BR>return accMul(arg, this); <BR>} <P>var a=0.69;<BR>var b=10;<BR>alert(a*b);//6.8999999999999995<BR>alert((a*100)/10);<BR></script>

直接调用函数就可以。

方法二:如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

alert(11*22.9);//得到251.89999999999998
alert(11*(22.9*10)/10);//得到251.9

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn