浮点数加减法 有精度问题

142 阅读1分钟

兼容ie6计算精度方法

通过调用方法进行计算,就能解决这些问题

先按照最大的小数位乘以10的小数位次方得到整数,进行计算,最后再除以10的负小数位恢复

/**
 * 浮点数新增 保证不会出现精度问题
 * @param {Array} arr 要相加的数字列表
 * @return {number}
 */
 function floatAdd(arr) {
    var sum = 0;
    var maxDecimalPlace = 0;
    var m;

    for (var i = 0; i < arr.length; i++) {
        var decimalPlace;
        try {
            decimalPlace = arr[i].toString().split('.')[1].length;
        } catch (e) {
            decimalPlace = 0;
        }
        if (decimalPlace > maxDecimalPlace) {
            maxDecimalPlace = decimalPlace;
        }
    }

    m = Math.pow(10, maxDecimalPlace);

    for (var i = 0; i < arr.length; i++) {
        sum += arr[i] * m;
    }

    return sum / m;
}

/**
 * 浮点数减法 保证不会出现精度问题
 * @param {Array} arr 要相减的数字列表
 * @return {number}
 */
function floatSubtract (arr) {
    var maxDecimalPlace = 0;
    var m;

    for (var i = 0; i < arr.length; i++) {
        var decimalPlace;
        try {
            decimalPlace = arr[i].toString().split('.')[1].length;
        } catch (e) {
            decimalPlace = 0;
        }
        if (decimalPlace > maxDecimalPlace) {
            maxDecimalPlace = decimalPlace;
        }
    }

    m = Math.pow(10, maxDecimalPlace);

    var result = arr[0] * m;
    for (var i = 1; i < arr.length; i++) {
        result -= arr[i] * m;
    }

    return result / m;
}
/**
 * 浮点数乘法 保证不会出现精度问题
 * @param {Array} arr 要相减的数字列表
 * @return {number}
 */
function multiplyArray(arr) {
    var factor = 1;
    var maxDecimals = 0;
    // 找出最大的小数位数
    for (var i = 0; i < arr.length; i++) {
        var strNum = arr[i].toString();
        var decimalIndex = strNum.indexOf('.');
        if (decimalIndex!== -1) {
            var decimals = strNum.length - decimalIndex - 1;
            if (decimals > maxDecimals) {
                maxDecimals = decimals;
            }
        }
    }
    factor = Math.pow(10, maxDecimals);
    var integerArray = [];
    for (var i = 0; i < arr.length; i++) {
        integerArray.push(Math.round(arr[i] * factor));
    }
    var product = 1;
    for (var i = 0; i < integerArray.length; i++) {
        product *= integerArray[i];
    }
    return product / Math.pow(factor, arr.length);
}