国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安阳县| 浮山县| 九龙县| 雅安市| 青川县| 临漳县| 孟村| 寻乌县| 天门市| 磴口县| 洛南县| 丹阳市| 都匀市| 红桥区| 昌黎县| 山阴县| 沁阳市| 班玛县| 简阳市| 乡城县| 明水县| 乌鲁木齐市| 溧水县| 玉田县| 宁海县| 科尔| 鸡西市| 临颍县| 邛崃市| 石渠县| 凤凰县| 潞西市| 阜新市| 庆城县| 云龙县| 庄河市| 信宜市| 德令哈市| 聊城市| 吉木萨尔县| 南召县|