js 常用計算
由於存在計算精度的問題,例如 0.1+0.2 = 0.30000000000000004
,所以需要整理以下方法,方便進行簡單計算。
主要思路是先轉成整數,然後再進行計算,計算完再轉回浮點數
獲取小數位以及向右移動小數位,是計算時轉換成整數的工具函式。加減乘除四個函式都用到了
獲取小數位
// 獲取小數位
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;
}