日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

js浮点数精度问题

發(fā)布時(shí)間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js浮点数精度问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://blog.csdn.net/dadadie/article/details/50385146

大多數(shù)語(yǔ)言在處理浮點(diǎn)數(shù)的時(shí)候都會(huì)遇到精度問(wèn)題,但是在JS里似乎特別嚴(yán)重,來(lái)看一個(gè)例子
alert(45.6*13);
結(jié)果居然是592.800000000001,當(dāng)然加法之類(lèi)的也會(huì)有這個(gè)問(wèn)題
那這是js的錯(cuò)誤嗎?
當(dāng)然不是,你的電腦做著正確的二進(jìn)制浮點(diǎn)運(yùn)算,但問(wèn)題是你輸入的是十進(jìn)制的數(shù),電腦以二進(jìn)制運(yùn)算,這兩者并不是總是轉(zhuǎn)化那么好的,有時(shí)候會(huì)得到正確的結(jié)果,但有時(shí)候就不那么幸運(yùn)了
alert(0.7+0.1);//輸出0.7999999999999999
alert(0.6+0.2);//輸出0.8

你輸入兩個(gè)十進(jìn)制數(shù),轉(zhuǎn)化為二進(jìn)制運(yùn)算過(guò)后再轉(zhuǎn)化回來(lái),在轉(zhuǎn)化過(guò)程中自然會(huì)有損失了
但一般的損失往往在乘除運(yùn)算中比較多,而JS在簡(jiǎn)單的加減法里也會(huì)出現(xiàn)這類(lèi)問(wèn)題,你也看到了,這個(gè)誤差也是非常小的,但是卻是不該出現(xiàn)的
那該怎么解決呢,ECMA4似乎給了解決方法,但是現(xiàn)在倒不是那么實(shí)用的
一種方法,比如0.7+0.1,先把0.1和0.7都乘10,加完之后再除10
另外可以自己寫(xiě)點(diǎn)函數(shù)來(lái)解決這個(gè)問(wèn)題,自己百度谷歌一下應(yīng)該有很多,但是最好還是不要用JS做一些復(fù)雜的浮點(diǎn)運(yùn)算,畢竟JS更多的作用不在于此

<script type="text/javascript"> // 兩個(gè)浮點(diǎn)數(shù)求和 function accAdd(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); // return (num1*m+num2*m)/m; return Math.round(num1*m+num2*m)/m; } // 兩個(gè)浮點(diǎn)數(shù)相減 function accSub(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); n=(r1>=r2)?r1:r2; return (Math.round(num1*m-num2*m)/m).toFixed(n); } // 兩數(shù)相除 function accDiv(num1,num2){ var t1,t2,r1,r2; try{ t1 = num1.toString().split('.')[1].length; }catch(e){ t1 = 0; } try{ t2=num2.toString().split(".")[1].length; }catch(e){ t2=0; } r1=Number(num1.toString().replace(".","")); r2=Number(num2.toString().replace(".","")); return (r1/r2)*Math.pow(10,t2-t1); } function accMul(num1,num2){ var m=0,s1=num1.toString(),s2=num2.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); } </script> <script> document.write("使用js原生態(tài)方法"); document.write("<br/> 1.01 + 1.02 ="+(1.01 + 1.02)); document.write("<br/> 1.01 - 1.02 ="+(1.01 - 1.02)); document.write("<br/> 0.000001 / 0.0001 ="+(0.000001 / 0.0001)); document.write("<br/> 0.012345 * 0.000001 ="+(0.012345 * 0.000001)); document.write("<br/><hr/>"); document.write("<br/>使用自定義方法"); document.write("<br/> 1.01 + 1.02 ="+accAdd(1.01,1.02)); document.write("<br/> 1.01 - 1.02 ="+accSub(1.01,1.02)); document.write("<br/> 0.000001 / 0.0001 ="+accDiv(0.000001,0.0001)); document.write("<br/> 0.012345 * 0.000001 ="+accMul(0.012345,0.000001)); </script>

總結(jié)

以上是生活随笔為你收集整理的js浮点数精度问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。