资源描述:
《js小数运算出现多为小数问题的解决方法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、JS小数运算出现多为小数问题的解决方法写在前面的话:今天帮同事解决了一个问题,就是小数相乘出现很多位小数的问题;这个问题自己以前也遇到过,现在特意来总结一下;Number类型:Number类型是ECMAScript中最常用和最令人关注的类型了;这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型,ECMA-262定义了不同的数值面量格式。十进制:varintNum=10;//整数八进制:varoctalNuml=070;//八进制的56v
2、aroctalNum2=079;//无效的八进制数值-解析为79八进制字面量在严格模式下是无效的;十六进制:varhexNuml=0xA;//10切记:在进行运算的时候,所有以八进制和十六进制表示的数值都最终被转换成十进制;为什么操作小数会出现误差?浮点数值的最高进度是17位小数,但在进行运算的时候其精确度却远远不如整数;整数在进行运算的时候都会转成10进制;而Java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第
3、一次的误差待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。所以(0.1+0.2)!=03解决方式:程序代码除法函数,用来得到精确的除法结果说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。调用:accDiv(argl,arg2)返回值:argl除以arg2的精确结果functionaccDiv(argl,arg2){nbsp;var11=0,t2=0,r1,r2:
4、nbsptry{tl=arg1.toString().split(〃.〃)[1].length}catch(e){nbsp;}try{nbsp;t2=arg2.toStringO.split(〃,)[1].length}catch(e){}nbsp;nbsp:with(Math){nbsp;nbsp:rl=Number(argl.toString().replace(",,""))nbsp;nbsp:r2=Number(arg2.toString().replace(〃二〃〃))nbsP;retu
5、rn(rl/r2)*pow(10,t2-11);}}给Number类型增加一个div方法,调用起来更加方便。Number,prototype.div=function(arg){nbsp;returnaccDiv(this,arg):nbsp;}乘法函数,用来得到精确的乘法结果说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。调用:accMul(argl,arg2)返回值:argl乘以arg2的精确结果functionaccMul(ar
6、gl,arg2){nbsp;varm=0,sl=argl.toString(),s2=arg2.toString():nbsp;try{m+=sl.split(〃/’)[1]•length}catch(e){}nbsp;m+=s2.split(〃•〃)[1].length}catch(e){}nbsp;returnNumber(s1.replace(〃.〃,〃〃))*Number(s2.replace(〃•〃,〃〃))/Math.pow(10,m)}给Number类型增加一个mul方法,调用起来更
7、加方便。Number.prototype.mul=function(arg){nbsp;returnaccMul(arg,this);加法函数,用来得到精确的加法结果说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。调用:accAdd(argl,arg2)返回值:argl加上arg2的精确结果functionaccAdd(argl,arg2){nbsp;varrl,r2,m;nbsp;try{rl=argl.toString().spl
8、it(〃•〃)[1].length}catch(e){rl=0}try{r2=arg2.toStringO.split(〃.〃)[1].length}catch(e){r2=0}m=Math.pow(10,Math,max(rl,r2))nbsp;return(argl*m+arg2*m)/m}给Number类型增加一个add方法,调用起来更加方便。Number.prototype.add=function(arg){nbsp;returnaccAdd(arg,this);在你要用