因爲存在計算精度的問題,例如 0.1+0.2 = 0.30000000000000004
,因此須要整理如下方法,方便進行簡單計算。javascript
主要思路是先轉成整數,而後再進行計算,計算完再轉回浮點數java
獲取小數位以及向右移動小數位,是計算時轉換成整數的工具函數。加減乘除四個函數都用到了
// 獲取小數位 export function getDecimalPlace(num) { try { let result = num.toString().split('.')[1].length; return result; } catch (e) { return 0; } }
/** * 向右移動小數點 * @param movePlace 移動步數,正向右,負數向左 */ export function moveDecimalPlace(num, movePlace) { let decimalPlace = getDecimalPlace(num); let step = movePlace - decimalPlace; // 先轉成整數類型,再肯定須要如何移動,爲了處理 268.34*100 卻等於 26833.999999999996 的問題 let intNum = Number(num.toString().replace('.', '')); if (step > 0) { return intNum * Math.pow(10, step); } else if (step < 0) { return intNum / Math.pow(10, -step); } else { return intNum; } }
這裏右移動小數點須要先轉成整形,再進一步處理是由於存在一些浮點數乘以 10 的倍數也會出問題!
例如:268.34*100 => 26833.999999999996
/** * 相加 arg1 + arg2 */ export function add(arg1, arg2) { let step1 = getDecimalPlace(arg1); let step2 = getDecimalPlace(arg2); let maxStep = Math.max(step1, step2); arg1 = moveDecimalPlace(arg1, maxStep); arg2 = moveDecimalPlace(arg2, maxStep); return (arg1 + arg2) / Math.pow(10, maxStep); }
/** * 相減 arg1 - arg2 */ export function sub(arg1, arg2) { return add(arg1, -arg2); }
/** * 乘法 arg1 * arg2 */ export function multiply(arg1, arg2) { let step1 = getDecimalPlace(arg1); let step2 = getDecimalPlace(arg2); let maxStep = Math.max(step1, step2); arg1 = moveDecimalPlace(arg1, maxStep); arg2 = moveDecimalPlace(arg2, maxStep); if (maxStep > 0) { let stepPow = Math.pow(10, maxStep); return (arg1 * arg2) / (stepPow * stepPow); } return arg1 * arg2; }
/** * 除法 arg1 / arg2 */ export function division(arg1, arg2) { let step1 = getDecimalPlace(arg1); let step2 = getDecimalPlace(arg2); let maxStep = Math.max(step1, step2); arg1 = moveDecimalPlace(arg1, maxStep); arg2 = moveDecimalPlace(arg2, maxStep); return arg1 / arg2; }
源碼連接git
更多代碼片斷github
我的博客連接函數