生活随笔
收集整理的這篇文章主要介紹了
js浮点数精度问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://blog.csdn.net/dadadie/article/details/50385146
大多數語言在處理浮點數的時候都會遇到精度問題,但是在JS里似乎特別嚴重,來看一個例子
alert(45.6*13);
結果居然是592.800000000001,當然加法之類的也會有這個問題
那這是js的錯誤嗎?
當然不是,你的電腦做著正確的二進制浮點運算,但問題是你輸入的是十進制的數,電腦以二進制運算,這兩者并不是總是轉化那么好的,有時候會得到正確的結果,但有時候就不那么幸運了
alert(0.7+0.1);//輸出0.7999999999999999
alert(0.6+0.2);//輸出0.8
你輸入兩個十進制數,轉化為二進制運算過后再轉化回來,在轉化過程中自然會有損失了
但一般的損失往往在乘除運算中比較多,而JS在簡單的加減法里也會出現這類問題,你也看到了,這個誤差也是非常小的,但是卻是不該出現的
那該怎么解決呢,ECMA4似乎給了解決方法,但是現在倒不是那么實用的
一種方法,比如0.7+0.1,先把0.1和0.7都乘10,加完之后再除10
另外可以自己寫點函數來解決這個問題,自己百度谷歌一下應該有很多,但是最好還是不要用JS做一些復雜的浮點運算,畢竟JS更多的作用不在于此
<script type=
"text/javascript"> // 兩個浮點數求和 function accAdd(num1,num2){ var
r1,
r2,mtry{
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)/mreturn Math
.round(num1*m+num2*m)/m} // 兩個浮點數相減 function accSub(num1,num2){ var
r1,
r2,mtry{
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:
r2return (Math
.round(num1*m-num2*m)/m)
.toFixed(n)} // 兩數相除 function accDiv(num1,num2){ var t1,t2,
r1,
r2try{ 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原生態方法")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>
總結
以上是生活随笔為你收集整理的js浮点数精度问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。