js加減乘除精確函數(shù)

原文鏈接:js加減乘除精確函數(shù)

js加減乘除精確原因和解決函數(shù)百度很多地方都能百度到,下面我把百度到的精華部分總結(jié)一下

先說說不精準原因:

拿0.1+0.2=0.30000000000000004進行舉例

首先,我們要站在計算機的角度思考 0.1 + 0.2 這個看似小兒科的問題妓灌。我們知道饱狂,能被計算機讀懂的是二進制章母,而不是十進制茫舶,所以我們先把 0.1 和 0.2 轉(zhuǎn)換成二進制看看:

0.1 => 0.0001 1001 1001 1001…(無限循環(huán))

0.2 => 0.0011 0011 0011 0011…(無限循環(huán))

上面我們發(fā)現(xiàn)0.1和0.2轉(zhuǎn)化為二進制之后雾袱,變成了一個無限循環(huán)的數(shù)字恤筛,這在現(xiàn)實生活中,無限循環(huán)我們可以理解芹橡,但計算機是不允許無限循環(huán)的毒坛,對于無限循環(huán)的小數(shù),計算機會進行舍入處理。進行雙精度浮點數(shù)的小數(shù)部分最多支持 52 位煎殷,所以兩者相加之后得到這么一串 0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 屯伞,因浮點數(shù)小數(shù)位的限制而截斷的二進制數(shù)字,這時候豪直,我們再把它轉(zhuǎn)換為十進制劣摇,就成了 0.30000000000000004。

我相信上面這部分文字解釋得很清楚弓乙,下面直接上精確計算代碼

// 浮點型乘法

NumberMul(arg1, arg2){

? ? var m = 0;

? ? var s1 = arg1.toString();

? ? var 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);

},


// 浮點型加法

NumberAdd(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

},


// 浮點型減法末融,被減數(shù),減數(shù)

NumberSub(arg1,arg2){

? ? return this.NumberAdd(arg1,-arg2);

},


// 被除數(shù)暇韧,除數(shù)勾习, 保留的小數(shù)點后的位數(shù)

NumberDiv(arg1,arg2,digit){

? ? var t1=0,t2=0,r1,r2;

? ? try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}

? ? try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}

? ? r1=Number(arg1.toString().replace(".",""))

? ? r2=Number(arg2.toString().replace(".",""))

? ? //獲取小數(shù)點后的計算值

? ? var result= ((r1/r2)*Math.pow(10,t2-t1)).toString()

? ? var result2=result.split(".")[1];

? ? result2=result2.substring(0,digit>result2.length?result2.length:digit);

? ? return Number(result.split(".")[0]+"."+result2);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市懈玻,隨后出現(xiàn)的幾起案子巧婶,更是在濱河造成了極大的恐慌,老刑警劉巖涂乌,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艺栈,死亡現(xiàn)場離奇詭異,居然都是意外死亡湾盒,警方通過查閱死者的電腦和手機湿右,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來历涝,“玉大人诅需,你說我怎么就攤上這事漾唉∮猓” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵赵刑,是天一觀的道長分衫。 經(jīng)常有香客問我,道長般此,這世上最難降的妖魔是什么蚪战? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮铐懊,結(jié)果婚禮上邀桑,老公的妹妹穿的比我還像新娘。我一直安慰自己科乎,他們只是感情好壁畸,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般捏萍。 火紅的嫁衣襯著肌膚如雪太抓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天令杈,我揣著相機與錄音走敌,去河邊找鬼。 笑死逗噩,一個胖子當(dāng)著我的面吹牛掉丽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播给赞,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼机打,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了片迅?” 一聲冷哼從身側(cè)響起残邀,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柑蛇,沒想到半個月后芥挣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡耻台,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年空免,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆耽。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋砚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摄杂,到底是詐尸還是另有隱情坝咐,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布析恢,位于F島的核電站墨坚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏映挂。R本人自食惡果不足惜泽篮,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柑船。 院中可真熱鬧帽撑,春花似錦、人聲如沸鞍时。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至专筷,卻和暖如春弱贼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磷蛹。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工吮旅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人味咳。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓庇勃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親槽驶。 傳聞我的和親對象是個殘疾皇子责嚷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容