麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

解決JS中乘法的浮點錯誤的方法

2019-11-20 21:19:36
字體:
來源:轉載
供稿:網友

JS里做小數的乘法運算時會出現浮點錯誤,具體可以測試一下: 

<script>
alert(11*22.9)
</script>

結果是251.89999999999998 而不是251.9 

這個問題想必有很多人為之頭痛。那么如何解決呢?在此給出解決辦法。

1、

復制代碼 代碼如下:

<script>
alert(11*(22.9*10)/10);
</script> 
 
解決問題的大概思路就是,先把因數放大為整數,最后再除以相應的倍數,這樣就能得到正確的結果了。 
2、
復制代碼 代碼如下:

<script defer>
Number.prototype.rate=function(){ 
var oStr=this.toString();
if(oStr.indexOf(".")==-1) 
return 1;
else
return Math.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
}

function tran(){
args=tran.arguments;
var temp=1;
for(i=0;i<args.length;i++)
temp*=args[ i ]*args[ i ].rate();
for(i=0;i<args.length;i++) 
temp/=args[ i ].rate();
return temp
}

alert(tran(11,22.9));

</script>


該解決辦法是比較麻煩的辦法,但是卻能讓你大概了解解決這個問題的實際過程。

也可以用四舍五入的方法,  js中可以使用Math.round實現整數的四舍五入,如果需要實現精確到小數點多少位則需要編寫函數了。

復制代碼 代碼如下:

function ForDight(Dight,How) {
   Dight = Math.round(Dight*Math.pow(10,How))/Math.pow(10,How);
   return Dight;
}  

//除法函數,用來得到精確的除法結果
//說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為 精確的除法結果。
//調用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精確結果
function accDiv(arg1,arg2){
var t1=0,t2=0,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString().split(".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}

//給Number類型增加一個div方法,調用起來更加 方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}

//乘法函數,用來得到精確的乘法結果
//說明:javascript的乘法結果會有誤差,在兩個浮點數 相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。
//調用:accMul(arg1,arg2)
//返回值:arg1乘以 arg2的精確結果
function accMul(arg1,arg2)
{
var m=0,s1=arg1.toString(),s2=arg2.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)
}

// 給Number類型增加一個mul方法,調用起來更加方便。
Number.prototype.mul = function (arg){
return accMul(arg, this);
}

//加法函數,用來得到精確的加法結果
//說明:javascript的加法 結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。
//調用:accAdd(arg1,arg2)
// 返回值:arg1加上arg2的精確結果
function accAdd(arg1,arg2){
var r1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m
}

//給Number類型增加一個add方法,調用起來更加方便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美午夜网 | 中国fx性欧美xxxx | 日日操夜夜透 | 欧美日韩夜夜 | 色阁阁69婷婷 | 18欧美性xxxx极品hd | 特级黄一级播放 | 久久久久久久久久美女 | 性欧美极品xxxx欧美一区二区 | 黄色片网站在线播放 | 国产一级毛片高清视频完整版 | 欧美视频99 | 久久久久久久久久性 | 久久凹凸 | 国产1区在线 | 黄色av一区二区三区 | 久久免费精品 | 亚洲第一页在线观看 | 亚洲aⅴ免费在线观看 | www69xxxxx| 日韩免费黄色 | 亚洲导航深夜福利涩涩屋 | 羞羞的视频免费在线观看 | 今井夏帆av一区二区 | 国产精品久久久久久久久久久久久久久 | 日本aaa一级片 | 国产一区二区久久精品 | 久久精品在线免费观看 | 日韩大片在线永久观看视频网站免费 | 海外中文字幕在线观看 | 国产成人在线一区 | 国产精品久久久久久久久久久久午夜 | 久久人人av | 久久久久国产成人精品亚洲午夜 | 成年人小视频在线观看 | 国产亚洲欧美一区久久久在 | 国产成人精品午夜视频' | 一级做a爰片性色毛片2021 | 国产成人免费高清激情视频 | 国产精品午夜一区 | 午夜精品老牛av一区二区三区 |