js加減乘除精確運算方法
阿新 • • 發佈:2021-01-16
技術標籤:javascript
因為計算機數字是浮點型,所以在計算過程中通常得到的並不是一個準確的資料,所以在做一些陣列運算的時候比較頭疼,我們這裡就來寫一下精確運算的方法
首先是加法 (這裡以兩個資料相加為例)
function add(arg1, arg2) {
arg1 = arg1.toString(), arg2 = arg2.toString(); // 將傳入的資料轉化為字串
var arg1Arr = arg1.split("."), // 將小數的資料從小數點的位置拆開
arg2Arr = arg2.split("." ),
d1 = arg1Arr.length == 2 ? arg1Arr[1] : "", // 獲取第一個數的小數點的長度
d2 = arg2Arr.length == 2 ? arg2Arr[1] : ""; // 獲取第二個數的小數點的長度
var maxLen = Math.max(d1.length, d2.length); // 獲取小數點長度較大的值
var m = Math.pow(10, maxLen); // 這裡表示10的小數點長度次方 也就是說如果小數點長度為2 m的值就是100 如果小數點長度是3 m的值就是1000如果不懂請自行查詢api
var result = Number(((arg1 * m + arg2 * m) / m).toFixed(maxLen)); // 將小數轉化為整數後相加在除掉兩個數乘過的倍數然後去小數點較長的長度的小數位數
var d = arguments[2]; // 第三個引數使用者可以自行決定是否要傳遞 用來定義要保留的小數長度
return typeof d === "number" ? Number((result).toFixed(d)) : result;
}
add(12.123, 12)
然後是減法 (減法其實就是一個數組加上另一個數字的負數所以和加法邏輯相同)
function sun(arg1, arg2) {
return add(arg1, -arg2)
}
其次是乘法
function mul(arg1, arg2) {
var r1 = arg1.toString(), // 將傳入的資料轉化為字串
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); // 獲取兩個數字的小數位數的和
// 乘積的演算法就是去掉小數點做整數相乘然後除去10的所有小數位的次方
resultVal = Number(r1.replace(".", "")) * Number(r2.replace(".", "")) / Math.pow(10, m);
return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
}
最後是減法 (除法和乘法就是一個相反的過程,不做過多解釋)
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)));
}