js 經常使用計算

js 經常使用計算

因爲存在計算精度的問題,例如 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

我的博客連接函數

相關文章
相關標籤/搜索