,,javascript(js)的小数点乘法除法问题详解

,,javascript(js)的小数点乘法除法问题详解

本文主要详细介绍了javascript(js)中的十进制乘除问题。有需要的朋友可以过来参考一下,希望能帮到你。

一、用js计算12.32 * 7结果是什么?答案是:86。40000。38601 . 68886888861

为什么会出现这种问题?怎么解决?js在处理小数的乘除运算时有一个bug。解决办法可以是:把小数变成整数来处理。以上的计算可以改为:12.32 * 100 * 7/100结果是:86.24,正确。

另外再计算一下:8.80 * 100 * 12/100结果:105.8000000000238.80也会出现类似的问题。

精确度增加10倍:8.80 * 1000 * 12/1000结果:105.6正常。

6.40 * 1,000,000 * 6/1,000,000结果也有问题。

为了让js执行的更准确,可以在以后的js十进制计算中,直接将数值展开一万倍,除以一万就可以解决问题。var num=38.80var num2=13alert(num * 10000 * 12/10000);

被乘除的数被检验为10000,这是最合适的数。如果很小,有些数字会出错,如果很大(100万),有些数字也会出错。

二、复制代码代码如下:script defender number . prototype . rate=function(){ varostr=this . tostring();if(oStr.indexOf(' . '))==-1)return 1;elsereturnMath.pow(10,parse int(ostr . length-ostr . index of(' . ')-1));}

function tran(){ args=tran . arguments;var temp=1;for(I=0;iargs.lengthi )temp*=args[i]*args[i]。rate();for(I=0;iargs.lengthi )temp/=args[i]。rate();returntemp}alert(tran(11,22.9));/script这个解决方案比较麻烦,但是可以让你了解解决这个问题的实际过程。复制如下代码://Division function,用来得到精确的除法结果。//说明:javascript的除法结果会有误差,两个浮点数相除会很明显。这个函数返回一个更精确的除法结果。//调用:accDiv(arg1,arg2)//返回值:arg1除以arg2函数的确切结果accdiv (arg1,arg2) {vart1=0,T2=0,R1,R2;请尝试{t1=arg1.toString()。拆分('.')[1].length } catch(e){ } try { T2=arg 2 . tostring()。拆分('.')[1].length } catch(e){ } with(Math){ R1=Number(arg 1 . tostring()。替换(' . '),' '))r2=Number(arg2.toString()。替换(' . '),' '))return (r1/r2)*pow(10,T2-t1);}}

//在数字类型中添加一个div方法,调用起来更方便。number . prototype . div=function(arg){ return accDiv(this,arg);}

//乘法函数,用来得到准确的乘法结果。//说明:javascript的乘法结果会有误差,两个浮点数相乘会很明显。这个函数返回一个更精确的乘法结果。//Call: accMul(arg1,arg2)//返回值:arg1乘以arg2函数accMul(arg1,arg2) {var m=0,S1=arg1.tostring(),S2=arg 2 . tostring();请尝试{m=s1.split(' . ')[1].length } catch(e){ } try { m=S2 . split(' . ')[1].length } catch(e){ }返回数字(s1.replace(' . ',' '))*数字(s2.replace(' . ',' '))/Math.pow(10,m)}

//在数字类型中添加一个mul方法,调用起来更方便。number . prototype . mul=function(arg){ return accMul(arg,this);}

//加法函数,用来得到准确的加法结果。//说明:javascript的加法结果会有误差,在加两个浮点数的时候会更明显。这个函数返回一个更精确的加法结果。//调用:accAdd(arg1,arg2)//返回值:arg1加arg2函数accadd (arg1,arg2) {varr1,r2,m;请尝试{r1=arg1.toString()。拆分('.')[1].length } catch(e){ R1=0 } try { R2=arg 2 . tostring()。拆分('.')[1].length } catch(e){ R2=0 } m=math . pow(10,Math.max(r1,r2))return (arg1*m arg2*m)/m}

//在数字类型中添加一个add方法,调用起来更方便。number . prototype . add=function(arg){ return accAdd(arg,this);}

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: