js加減乘除精確運(yùn)算方法實(shí)例代碼
前言
因?yàn)橛?jì)算機(jī)數(shù)字是浮點(diǎn)型,所以在計(jì)算過(guò)程中通常得到的并不是一個(gè)準(zhǔn)確的數(shù)據(jù),所以在做一些數(shù)組運(yùn)算的時(shí)候比較頭疼,我們這里就來(lái)寫一下精確運(yùn)算的方法
首先是加法 (這里以兩個(gè)數(shù)據(jù)相加為例)
function add(arg1, arg2) {
arg1 = arg1.toString(), arg2 = arg2.toString(); // 將傳入的數(shù)據(jù)轉(zhuǎn)化為字符串
var arg1Arr = arg1.split("."), // 將小數(shù)的數(shù)據(jù)從小數(shù)點(diǎn)的位置拆開
arg2Arr = arg2.split("."),
d1 = arg1Arr.length == 2 ? arg1Arr[1] : "", // 獲取第一個(gè)數(shù)的小數(shù)點(diǎn)的長(zhǎng)度
d2 = arg2Arr.length == 2 ? arg2Arr[1] : ""; // 獲取第二個(gè)數(shù)的小數(shù)點(diǎn)的長(zhǎng)度
var maxLen = Math.max(d1.length, d2.length); // 獲取小數(shù)點(diǎn)長(zhǎng)度較大的值
var m = Math.pow(10, maxLen); // 這里表示10的小數(shù)點(diǎn)長(zhǎng)度次方 也就是說(shuō)如果小數(shù)點(diǎn)長(zhǎng)度為2 m的值就是100 如果小數(shù)點(diǎn)長(zhǎng)度是3 m的值就是1000如果不懂請(qǐng)自行查找api
var result = Number(((arg1 * m + arg2 * m) / m).toFixed(maxLen)); // 將小數(shù)轉(zhuǎn)化為整數(shù)后相加在除掉兩個(gè)數(shù)乘過(guò)的倍數(shù)然后去小數(shù)點(diǎn)較長(zhǎng)的長(zhǎng)度的小數(shù)位數(shù)
var d = arguments[2]; // 第三個(gè)參數(shù)用戶可以自行決定是否要傳遞 用來(lái)定義要保留的小數(shù)長(zhǎng)度
return typeof d === "number" ? Number((result).toFixed(d)) : result;
}
add(12.123, 12)
然后是減法 (減法其實(shí)就是一個(gè)數(shù)組加上另一個(gè)數(shù)字的負(fù)數(shù)所以和加法邏輯相同)
function sun(arg1, arg2) {
return add(arg1, -arg2)
}
其次是乘法
function mul(arg1, arg2) {
var r1 = arg1.toString(), // 將傳入的數(shù)據(jù)轉(zhuǎn)化為字符串
r2 = arg2.toString(),
m, resultVal, d = arguments[2];
m = (r1.split(".")[1] ? r1.split(".")[1].length : 0) + (r2.split(".")[1] ? r2.split(".")[1].length : 0); // 獲取兩個(gè)數(shù)字的小數(shù)位數(shù)的和
// 乘積的算法就是去掉小數(shù)點(diǎn)做整數(shù)相乘然后除去10的所有小數(shù)位的次方
resultVal = Number(r1.replace(".", "")) * Number(r2.replace(".", "")) / Math.pow(10, m);
return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
}
最后是減法 (除法和乘法就是一個(gè)相反的過(guò)程,不做過(guò)多解釋)
function div(arg1, arg2) {
var r1 = arg1.toString(),
r2 = arg2.toString(),
m, resultVal, d = arguments[2];
m = (r2.split(".")[1] ? r2.split(".")[1].length : 0) - (r1.split(".")[1] ? r1.split(".")[1].length : 0);
resultVal = Number(r1.replace(".", "")) / Number(r2.replace(".", "")) * Math.pow(10, m);
return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
}
總結(jié)
到此這篇關(guān)于js加減乘除精確運(yùn)算方法的文章就介紹到這了,更多相關(guān)js加減乘除精確運(yùn)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)無(wú)限級(jí)樹形導(dǎo)航列表效果代碼
這篇文章主要介紹了js實(shí)現(xiàn)無(wú)限級(jí)樹形導(dǎo)航列表效果代碼,通過(guò)一個(gè)封裝的JS類實(shí)現(xiàn)無(wú)限樹形導(dǎo)航的效果,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-09-09
echarts同一頁(yè)面中四個(gè)圖表切換的js數(shù)據(jù)交互方法示例
這篇文章主要給大家介紹了關(guān)于echarts同一頁(yè)面中四個(gè)圖表切換的js數(shù)據(jù)交互的相關(guān)資料,文中給出了完整的示例代碼供大家參考學(xué)習(xí),對(duì)大家的學(xué)習(xí)或者工作具有一定的幫助,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
js實(shí)現(xiàn)橫向百葉窗效果網(wǎng)頁(yè)切換動(dòng)畫效果的方法
這篇文章主要介紹了js實(shí)現(xiàn)橫向百葉窗效果網(wǎng)頁(yè)切換動(dòng)畫效果的方法,實(shí)例分析了javascript實(shí)現(xiàn)百葉窗效果的技巧,需要的朋友可以參考下2015-03-03
javascript實(shí)現(xiàn)漂亮的拖動(dòng)層,窗口拖拽特效
一個(gè)可關(guān)閉、可隨意拖動(dòng)位置的網(wǎng)頁(yè)彈出層代碼,美化的相當(dāng)漂亮,簡(jiǎn)潔實(shí)用,還可拖動(dòng)改變大小,通過(guò)八個(gè)方向改變大小,學(xué)習(xí)這類特效編寫的網(wǎng)頁(yè)設(shè)計(jì)者可參閱一下2015-04-04
javascript Array數(shù)組對(duì)象的擴(kuò)展函數(shù)代碼
我們經(jīng)常給 String,Function,Array 的原型加上自定義的擴(kuò)展函數(shù),比如去除字符串空格,數(shù)組排序等2010-05-05
js return返回多個(gè)值,通過(guò)對(duì)象的屬性訪問(wèn)方法
下面小編就為大家?guī)?lái)一篇js return返回多個(gè)值,通過(guò)對(duì)象的屬性訪問(wèn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
原生js實(shí)現(xiàn)class的添加和刪除簡(jiǎn)單代碼
下面小編就為大家?guī)?lái)一篇原生js實(shí)現(xiàn)class的添加和刪除簡(jiǎn)單代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07

