js加減乘除丟失精度問題解決方法
更新時間:2014年05月16日 17:05:40 作者:
在javascript中,帶小數(shù)的數(shù)據(jù)運算時總會出現(xiàn)好多位小數(shù).這是因為在javascript中浮點數(shù)的計算是以2進制計算的
在javascript中,當你使用小數(shù)進行加減乘除運算時,你會發(fā)現(xiàn),所得到的結(jié)果有時后面帶有長長的一段小數(shù),使運算變得復(fù)雜,并且影響計算結(jié)果。上網(wǎng)查詢了一下原因,大致如下:在javascript中,帶小數(shù)的數(shù)據(jù)運算時總會出現(xiàn)好多位小數(shù).這是因為在javascript中浮點數(shù)的計算是以2進制計算的。
/**
* 加法運算,避免數(shù)據(jù)相加小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1加數(shù)1 | num2加數(shù)2
*/
function numAdd(num1, num2) {
var baseNum, baseNum1, baseNum2;
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
return (num1 * baseNum + num2 * baseNum) / baseNum;
};
/**
* 加法運算,避免數(shù)據(jù)相減小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1被減數(shù) | num2減數(shù)
*/
function numSub(num1, num2) {
var baseNum, baseNum1, baseNum2;
var precision;// 精度
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
};
/**
* 乘法運算,避免數(shù)據(jù)相乘小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1被乘數(shù) | num2乘數(shù)
*/
function numMulti(num1, num2) {
var baseNum = 0;
try {
baseNum += num1.toString().split(".")[1].length;
} catch (e) {
}
try {
baseNum += num2.toString().split(".")[1].length;
} catch (e) {
}
return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
};
/**
* 除法運算,避免數(shù)據(jù)相除小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1被除數(shù) | num2除數(shù)
*/
function numDiv(num1, num2) {
var baseNum1 = 0, baseNum2 = 0;
var baseNum3, baseNum4;
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
with (Math) {
baseNum3 = Number(num1.toString().replace(".", ""));
baseNum4 = Number(num2.toString().replace(".", ""));
return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
}
};
復(fù)制代碼 代碼如下:
/**
* 加法運算,避免數(shù)據(jù)相加小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1加數(shù)1 | num2加數(shù)2
*/
function numAdd(num1, num2) {
var baseNum, baseNum1, baseNum2;
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
return (num1 * baseNum + num2 * baseNum) / baseNum;
};
/**
* 加法運算,避免數(shù)據(jù)相減小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1被減數(shù) | num2減數(shù)
*/
function numSub(num1, num2) {
var baseNum, baseNum1, baseNum2;
var precision;// 精度
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
};
/**
* 乘法運算,避免數(shù)據(jù)相乘小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1被乘數(shù) | num2乘數(shù)
*/
function numMulti(num1, num2) {
var baseNum = 0;
try {
baseNum += num1.toString().split(".")[1].length;
} catch (e) {
}
try {
baseNum += num2.toString().split(".")[1].length;
} catch (e) {
}
return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
};
/**
* 除法運算,避免數(shù)據(jù)相除小數(shù)點后產(chǎn)生多位數(shù)和計算精度損失。
*
* @param num1被除數(shù) | num2除數(shù)
*/
function numDiv(num1, num2) {
var baseNum1 = 0, baseNum2 = 0;
var baseNum3, baseNum4;
try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch (e) {
baseNum2 = 0;
}
with (Math) {
baseNum3 = Number(num1.toString().replace(".", ""));
baseNum4 = Number(num2.toString().replace(".", ""));
return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
}
};
相關(guān)文章
javaScript產(chǎn)生隨機數(shù)的用法小結(jié)
這篇文章主要介紹了javaScript產(chǎn)生隨機數(shù)的用法小結(jié),包括JavaScript Math.random()內(nèi)置函數(shù) ,Js 隨機數(shù)產(chǎn)生6位數(shù)字的代碼,需要的朋友可以參考下2018-04-04JavaScript 常見安全漏洞和自動化檢測技術(shù)
js安全漏洞目前存在較大的技術(shù)難題,本文結(jié)合案例給大家詳解JavaScript 常見安全漏洞和自動化檢測技術(shù),需要的朋友可以參考下2015-08-08Vue項目vscode 安裝eslint插件的方法(代碼自動修復(fù))
這篇文章主要介紹了Vue項目vscode 安裝eslint插件的方法 代碼自動修復(fù),需要的朋友可以參考下2020-04-04js復(fù)制文本到粘貼板(Clipboard.writeText())
這篇文章主要介紹了js復(fù)制文本到粘貼板(Clipboard.writeText()),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07