js实现银行家四舍六入五考虑

2020-05-19

四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一

//保留小数点后2位,并进行四舍五入(银行家四舍五入)|places 保留位数,默认为2
function zzt1(value, places) {
    places = (places || places == 0) ? places : 2;
    value = value.toString();
    if (value.indexOf(".") == -1) {
        return value;
    }
    let nums = value.split(".");
    let decimals = nums[1].toString();
    let decimal_len = decimals.length;
    if (decimal_len <= 0) {
        return value;
    }
    let decimal_array = [];
    //如果数字整数位为0,那么保留2位有效数字(0不属于有效数字)
    if (nums[0] == "0") {
        let strnum = 0;
        for (let i = 0; i < decimal_len; i++) {
            if (strnum == places) {
                var residue = decimals.substr(i);
                break;
            }
            let zui1 = decimals.substr(i, 1);
            decimal_array.push(zui1); //存储小数部分
            if (zui1 != 0) {
                strnum++;
            }

        }
    // 数字整数位不为1时,保留2位数字
    } else {
        for (let i = 0; i < decimal_len; i++) {
            if (decimal_array.length == places) {
                var residue = decimals.substr(i);
                break;
            }
            let zui1 = decimals.substr(i, 1);
            decimal_array.push(zui1);
        }
    }
    //如果保留2位小数后,原数小数位还有剩余,那么进行四舍五入的判断
    if (residue) {
        let result = zzt2(residue);
        if (places == 0) {
            var end_num = nums[0].split("").pop();
        } else {
            var end_num = decimal_array.pop();
        }
        if (end_num == undefined || !end_num) {
            end_num = 0;
        }

        if (places == 0) {
            var new_str = Number(nums[0]) + (result == 3 ? ((end_num % 2 == 0) ? 0 : 1) : result);
        } else {
            if (result == 3) {
                let jioushu = (end_num % 2 == 0) ? 0 : 1;
                end_num = Number(end_num) + jioushu;
            } else {
                end_num = Number(end_num) + result;
            }

            decimal_array.push(end_num);

            //将数字的数组进行处理,将大于10的进行处理
            let new_decimal_array = zzt3(decimal_array, places);

            let integer = new_decimal_array.pop();

            new_decimal_array.reverse();
            let decimal = new_decimal_array.join("");

            let the_integer = Number(nums[0]) + Number(integer);
            var new_str = the_integer + "." + decimal;
        }
    } else {
        var new_str = places == 0 ? nums[0] : (nums[0] + "." + decimal_array.join(""));
    }
    return parseFloat(new_str);
}
//银行家四舍五入判断使用
//将字符串转换成数组处理,如果数组长度大于等于1,那么{如果数组第0位数组小于5返回0,大于5返回1,等于5{如果数组中剩余的字段中没有大于0的数字,返回3,否则返回1,如果数组没有其他的值返回3}},如果长度等于0,返回0
function zzt2(value) {
    let value_array = value.split("");
    let len = value_array.length;
    if (len >= 1) {
        if (value_array[0] < 5) {
            return 0;
        } else if (value_array[0] > 5) {
            return 1;
        } else if (value_array[0] == 5) {
            let ii = 0;
            if (value_array[1]) {
                for (let i = 1; i < len; i++) {
                    if (value_array[i] > 0) {
                        ii = 1;
                        break;
                    }
                }
            } else {
                return 3;
            }
            return ii == 0 ? 3 : 1;
        }
    } else if (len == 0) {
        return 0;
    }
}

//数组循环,对数组中的每个数进行判断,如果数字大于10,那么取尾数放到新数组,十位数赋值给j加到下一个数字上,返回新数组
function zzt3(number_array, places) {
    places = places || 2;
    number_array.reverse();
    let new_number_array = [];
    let j = 0;
    let array_num = number_array.length;
    for (let i = 0; i < array_num; i++) {
        let new_i = Number(number_array[i]) + j;
        if (new_i >= 10) {
            let new_i1 = new_i.toString().split("");
            new_number_array.push(new_i1[1]);
            j = Number(new_i1[0]);
        } else {
            new_number_array.push(new_i);
            j = 0;
        }
    }
    if (places != 0) {
        new_number_array.push(j);
    }
    return new_number_array;
}

 

{/if}