天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript 浮點數運算 精度問題

Js代碼
復制代碼 代碼如下:
<script type="text/Javascript" language="Javascript">
alert(1/3);//彈出: 0.3333333333333333
alert(0.09999999 + 0.00000001);//彈出: 0.09999999999999999
alert(-0.09999999 - 0.00000001);//彈出: -0.09999999999999999
alert(0.012345 * 0.000001);//彈出: 1.2344999999999999e-8
alert(0.000001 / 0.0001);//彈出: 0.009999999999999998
</script>
<script type="text/Javascript" language="Javascript">
    alert(1/3);//彈出: 0.3333333333333333
    alert(0.09999999 + 0.00000001);//彈出: 0.09999999999999999
    alert(-0.09999999 - 0.00000001);//彈出: -0.09999999999999999
    alert(0.012345 * 0.000001);//彈出: 1.2344999999999999e-8
    alert(0.000001 / 0.0001);//彈出: 0.009999999999999998
</script>
[code]
按正常計算的話,除第一行外(因為其本身就不能除盡),其他都應該要得到精確的結果,從彈出的結果我們卻發現不是我們想要的正確結果。為了解決浮點數運算不準確的問題,在運算前我們把參加運算的數先升級(10的X的次方)到整數,等運算完后再降級(0.1的X的次方)。現收集并整理貼于此,以備后用。
加法
Js代碼
[code]
//說明: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);
}
//說明: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);
}
減法
Js代碼
[code]
//說明:Javascript的減法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的減法結果。
//調用:accSub(arg1,arg2)
//返回值:arg1減上arg2的精確結果
function accSub(arg1,arg2){
return accAdd(arg1,-arg2);
}
//給Number類型增加一個sub方法,調用起來更加方便。
Number.prototype.sub = function (arg){
return accSub(this,arg);
}
//說明:Javascript的減法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的減法結果。
//調用:accSub(arg1,arg2)
//返回值:arg1減上arg2的精確結果
function accSub(arg1,arg2){
return accAdd(arg1,-arg2);
}
//給Number類型增加一個sub方法,調用起來更加方便。
Number.prototype.sub = function (arg){
return accSub(this,arg);
}

乘法
Js代碼
復制代碼 代碼如下:
//說明: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的乘法結果會有誤差,在兩個浮點數相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。
//調用: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);
} 除法
Js代碼
//說明: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的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。
//調用: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);
}

測試一把
Js代碼
復制代碼 代碼如下:
<script type="text/Javascript" language="Javascript">
/*
alert(0.09999999 + 0.00000001);//彈出: 0.09999999999999999
alert(-0.09999999 - 0.00000001);//彈出: -0.09999999999999999
alert(0.012345 * 0.000001);//彈出: 1.2344999999999999e-8
alert(0.000001 / 0.0001);//彈出: 0.009999999999999998
*/
alert(0.09999999.add(0.00000001));//彈出: 0.1
alert(-0.09999999.sub(0.00000001));//彈出: -0.09999998
alert(0.012345.mul(0.000001));//彈出: 1.2345e-8
alert(0.000001.div(0.0001));//彈出: 0.01
</script>

JavaScript技術JavaScript 浮點數運算 精度問題,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久伊人精品青青草原2021 | 美女被男人撕衣舔胸 | 性感尼姑风流寺 | 成人亚洲乱码在线 | 性夜影院午夜看片 | 51vv视频社区 | 手机毛片在线观看 | 国产成+人欧美+综合在线观看 | 91精品婷婷国产综合久久8 | 暖暖视频免费观看社区 | 英国video性精品高清最新 | 第九色区av天堂 | 精品AV国产一区二区三区 | 91久久偷偷做嫩草影院免 | 日韩高清在线亚洲专区 | 日本68xxxxxxxxx老师 | 欧美一区二区高清 | 色四房播播 | 九九热视频免费 | 中文字幕亚洲欧美日韩2019 | 亚洲欧美一区二区久久 | 中文字幕A片视频一区二区 中文字幕AV在线一二三区 | 99久久无码一区人妻A片竹菊 | 亚洲欧美精品一中文字幕 | 儿子日母亲B好爽 | 老司机福利在视频在ae8 | 国产亚洲视频在线播放香蕉 | 久久成人a毛片免费观看网站 | 被男按摩师添的好爽在线直播 | 一本色道久久88综合日韩精品 | 麻花豆传媒剧国产免费mv观看 | 丝瓜视频樱桃视频在线观看免费 | 98色精品视频在线 | 外国xxxx| 伊人草 | 国产AV无码熟妇人妻麻豆 | 忘忧草日本在线WWW日本 | 99久久国产露脸精品竹菊传煤 | 日本久久精品免视看国产成人 | 久久热免费视频 | 灌饱娇嫩H将军公主最新章节 |