本文主要介紹javascript浮點數(shù)(js浮點計算精度問題),下面一起看看javascript浮點數(shù)(js浮點計算精度問題)相關(guān)資訊。
javascript中只有一種類型的數(shù)字,javascript中所有的數(shù)字都用ieee-754標準格式表示。浮點數(shù)的準確性不是javascript獨有的,因為用二進制表示的十進制數(shù)是無限的。十進制二進制0.1 0.0001100110011001…0.2 0.001100111…0.3 0.01001101100…0.4 0.001101101110…0.5 0.6 0.100010.1000111011 javascript中的問題比較復雜,這里只給出部分測試數(shù)據(jù):console.log(1really console . log(1.0-0.2 = = 0.8)//really console . log(1.0-0.1 = = 0.9)//really這個1.0-0.9怎么避免!= 0.1非bug問題下面給出了一個更廣泛使用的解決方案。在判斷浮點運算的結(jié)果之前,會降低計算的精度,因為在降低精度的過程中總有四輪五項。(1.0-0.9)。tofixed (bit)//precision參數(shù)應介于0和20之間。console . log(parse float((1.0-0.9))。fixed(10))= 0.1//true)console . log(parse float((1.0-0.8)。fixed(10))= 0.2//true)console . log(解析浮點((1.0-0.7)。tofixed(10))= 0.3//true)console . log(parse float((11.0-11.8))。fixed(10))= = = 0.8)//真的寫個辦法:確定值的方法等于//(number1,number2函數(shù)相等,number){ number = number = undefined 10:number;默認精度為10。返回number1.tofixed(數(shù)字)= number2.tofixed(數(shù)字);} console.log(等于(1.0-0.7,0.3));//真原型/擴展模式,偏好面向?qū)ο箫L格number . prototype . is equal = function(位數(shù)){ number = number = undefined 10:number;默認精度為10。返回this . to fixed(digits)= number . to fixed(numbers);} console.log((1.0-0.7).is equal(0.3));//真的接下來,試試浮點運算。console . log(1.79 0.12)//1.91000000000000001 console . log(2.01-0.12)//1.88999999999999997 console . log(1.01×1.3)//1.3130000000000002 console . log(0.69/10)//0.0689999999999999說明:javascript加法結(jié)果會有誤差,兩者浮動在一起會更明顯。這個函數(shù)返回一個更精確的加法結(jié)果。//tel: accadd(arg1,arg2)//返回值:arg1加arg 2精確結(jié)果函數(shù)accadd(arg1,arg2){ var,r2,m;試試{r1 = arg1.tostring(split)。{){ 1}}長度捕獲(e){ = 0 } try { r2 = arg 2 . tostring(split。{){ 1 } } length capture(e){ = 0 } m = math . pow(10,math.max(r1,r2))返回(arg1 * m 2×m)/ m}增加加號類型的方法,調(diào)用起來更方便。number . prototype . add = function(arg){ return accadd(arg,this);}減能,減法得到準確結(jié)果:javascript加法的結(jié)果會有誤差,兩者浮動在一起會更明顯。這個函數(shù)返回一個更精確的減法結(jié)果。//tel: accsub(arg1,arg 2)//返回值:arg1減2精確結(jié)果函數(shù)accsub(arg1,arg2){ var,r2,m,n;試試{r1 = arg1.tostring(split)。{){ 1}}長度捕獲(e){ = 0 } try { r2 = arg 2 . tostring(split。{){ 1}}長度捕獲(e){ = 0} m = math.pow(10,math.max(r1,r2)););//最后修改的deeka動態(tài)控制精度長度n(= r2 = r2);returns((arg 1 * m-arg 2×m)/m)fixed(n);}得到一個準確的除法/函數(shù)除法結(jié)果。描述:javascript/除法結(jié)果會出錯。當兩個浮點除法比較明顯的時候,這個函數(shù)會返回一個比較準確的除法結(jié)果。//tel: accdiv(arg1,arg 2)//返回值:精確結(jié)果除以2 arg1函數(shù)accdiv(arg1,arg2){ var t1 = 0,t2 = 0,r1,r2;嘗試{t1 = arg1.tostring(。分)(。){ 1 }。length}追到(e){}試試{t2 = arg2.tostring(。分)(。){ 1 }。長度}趕上(e){}使用(數(shù)學){r1 =數(shù)字(arg1.tostring。替換(,r2 = number (arg2.tostring)。替換(,返回(r1和r2)* pow(10,t2-t1);}}增加div類型數(shù)量的方法,調(diào)用更方便。number . prototype . div = function(arg){ returns accdiv(this,arg);}熟悉乘法函數(shù),乘法準確描述:當兩個浮點乘法比較明顯時,會出現(xiàn)錯誤,這個函數(shù)會返回比較準確的乘法結(jié)果。//tel: accmul(arg1,arg 2)//返回值:arg1乘以2精確結(jié)果函數(shù)accmul(arg1,arg2){ var m = 0,s1,s2 = = arg 1 . tostringarg 2 . tostring;請嘗試{m = s1.split(,){1}。length}追到(e){}試試{m = s2.split(,){1}。長的度}趕上(e){}號(s1.replace(。}一種改進多/數(shù)字類型的方法,調(diào)用起來更方便。number . prototype . mul = function(arg){ returns accmul(arg,this);} check: console.log(accadd(1.79,0.12));/ / 1.91 console.log(accsub(2.01,0.12));/ / 1.89 console.log(accdiv(0.69,10));/ / 0.069console.log(accmul(1.01,1.3));//1.313改造后可以愉快地操作運算的內(nèi)容~加減乘除。希望對大家有幫助,支持你。
了解更多javascript浮點數(shù)(js浮點計算精度問題)相關(guān)內(nèi)容請關(guān)注本站點。