前言
因為計算機數字是浮點型,所以在計算過程中通常得到的并不是一個準確的數據,所以在做一些數組運算的時候比較頭疼,我們這里就來寫一下精確運算的方法
首先是加法 (這里以兩個數據相加為例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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) |
然后是減法 (減法其實就是一個數組加上另一個數字的負數所以和加法邏輯相同)
1
2
3
|
function sun(arg1, arg2) { return add(arg1, -arg2) } |
其次是乘法
1
2
3
4
5
6
7
8
9
10
|
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))); } |
最后是減法 (除法和乘法就是一個相反的過程,不做過多解釋)
1
2
3
4
5
6
7
8
|
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))); } |
總結
到此這篇關于js加減乘除精確運算方法的文章就介紹到這了,更多相關js加減乘除精確運算內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/wjw0125/article/details/112656538