js中浮點(diǎn)型運(yùn)算BUG的解決方法說明
曾經(jīng)項(xiàng)目用到過的,之前在網(wǎng)上找到此代碼,但在特定條件下除法和加法運(yùn)算依然會(huì)出現(xiàn)BUG個(gè)人對(duì)此稍作優(yōu)化
//除法函數(shù),用來得到精確的除法結(jié)果
//說明:javascript的除法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相除的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的除法結(jié)果。
//調(diào)用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精確結(jié)果
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 accMul((r1 / r2),pow(10, t2 - t1));
}
}
//乘法函數(shù),用來得到精確的乘法結(jié)果
//說明:javascript的乘法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相乘的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的乘法結(jié)果。
//調(diào)用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精確結(jié)果
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)
}
//加法運(yùn)算中級(jí)解決辦法
function accAdd(arg1, arg2) {
var r1, r2, m, c;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2))
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
}
else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
}
else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return accDiv((arg1 + arg2),m);
}
相關(guān)文章
僅一個(gè)form表單 js實(shí)現(xiàn)注冊(cè)信息依次填寫提交功能
這篇文章主要為大家詳細(xì)介紹了僅一個(gè)form表單,JavaScript可實(shí)現(xiàn)注冊(cè)信息依次填寫提交功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06js實(shí)現(xiàn)手表表盤時(shí)鐘與圓周運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)手表表盤時(shí)鐘與圓周運(yùn)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09js獲取數(shù)組最后一位元素的五種方法及執(zhí)行效率對(duì)比
js獲取數(shù)組最后一位元素的五種方法代碼示例,使用console.time和console.timeEnd測(cè)量javascript腳本程序執(zhí)行效率對(duì)比2023-08-08一文教你用JavaScript制作個(gè)簡(jiǎn)單的大轉(zhuǎn)盤游戲
日常生活中,我們經(jīng)常會(huì)見到形形色色的抽獎(jiǎng)活動(dòng),例如九宮格、大轉(zhuǎn)盤等等……本文就來教大家如何利用JavaScript制作個(gè)簡(jiǎn)單的大轉(zhuǎn)盤游戲,感興趣的可以了解一下2023-02-02JavaScript截屏功能的實(shí)現(xiàn)代碼
我覺得使用JS截圖的想法是非?;闹嚨模紫菾S沒有權(quán)限調(diào)用操作系統(tǒng)的截圖功能,其次,瀏覽器(BOM)也沒有提供相關(guān)的截圖接口,經(jīng)過一番折騰,有點(diǎn)思路了,下面通過實(shí)例代碼給大家簡(jiǎn)單介紹下js 截屏功能的實(shí)現(xiàn)代碼,一起看看吧2017-07-07TypeScript實(shí)現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換
樹或者圖是個(gè)比較抽象的概念,并不存在這樣的數(shù)據(jù)類型。數(shù)組就比較簡(jiǎn)單了,因此數(shù)組和樹的轉(zhuǎn)換可以理解為數(shù)組和對(duì)象之間的轉(zhuǎn)換。本文將用TypeScript實(shí)現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換,感興趣的可以了解一下2022-06-06javascript對(duì)talbe進(jìn)行動(dòng)態(tài)添加、刪除、驗(yàn)證實(shí)現(xiàn)代碼
javascript對(duì)talbe進(jìn)行動(dòng)態(tài)添加、刪除、驗(yàn)證實(shí)現(xiàn)代碼,需要的朋友可以參考下2012-03-03js實(shí)現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的三種方式
Blob對(duì)象表示一個(gè)不可變、原始數(shù)據(jù)的類文件對(duì)象,Blob表示的不一定是JavaScript原生格式的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于js實(shí)現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的三種方式,需要的朋友可以參考下2023-04-04