js toFixed 真正四舍五入

真正四舍五入

//toFixed兼容方法,四舍五入
Number.prototype.toFixed = function (len) {
    if (len > 20 || len < 0) {
        throw new RangeError('toFixed() digits argument must be between 0 and 20');
    }
    // .123转为0.123
    var number = Number(this);
    if (isNaN(number) || number >= Math.pow(10, 21)) {
        return number.toString();
    }
    if (typeof (len) == 'undefined' || len == 0) {
        return (Math.round(number)).toString();
    }
    var result = number.toString(),
        numberArr = result.split('.');

    if (numberArr.length < 2) {
        //整数的情况
        return padNum(result);
    }
    var intNum = numberArr[0], //整数部分
        deciNum = numberArr[1],//小数部分
        lastNum = deciNum.substr(len, 1);//最后一个数字

    if (deciNum.length == len) {
        //需要截取的长度等于当前长度
        return result;
    }
    if (deciNum.length < len) {
        //需要截取的长度大于当前长度 1.3.toFixed(2)
        return padNum(result)
    }
    //需要截取的长度小于当前长度,需要判断最后一位数字
    result = intNum + '.' + deciNum.substr(0, len);
    if (parseInt(lastNum, 10) >= 5) {
        //最后一位数字大于5,要进位
        var times = Math.pow(10, len); //需要放大的倍数
        var changedInt = Number(result.replace('.', ''));//截取后转为整数
        var fu = 1/changedInt < 0;// 为true 时,则 changedInt < 0 或者 changedInt = -0,否则为正数或等于0
        if(fu){
            changedInt--;//整数进位
        }else{
            changedInt++;//整数进位
        }
        changedInt /= times;//整数转为小数,注:有可能还是整数
        result = padNum(changedInt + '');
    }
    return result;
    //对数字末尾加0
    function padNum(num) {
        var dotPos = num.indexOf('.');
        if (dotPos === -1) {
            //整数的情况
            num += '.';
            for (var i = 0; i < len; i++) {
                num += '0';
            }
            return num;
        } else {
            //小数的情况
            var need = len - (num.length - dotPos - 1);
            for (var j = 0; j < need; j++) {
                num += '0';
            }
            return num;
        }
    }
}

 

posted @ 2020-05-26 10:31  三瑞  阅读(644)  评论(0编辑  收藏  举报