控制小数的四舍五入,以及不足小数位数时,是否自动补零

  /**
   * 把Number四舍五入为指定小数位数的数字字符串(解决原toFixed四舍五入问题)
   * @param {number} [len=0] 保留小数位数
   * @param {boolean} [round=true] 是否四舍五入(默认进行四舍五入)
   * @param {boolean} [padding=true] 有效数字不足预设小数位数时是否后补0(默认后补)如:_toFixed(1.1,3,true,true) = "1.100"  ;   _toFixed(1.1,3,true,false) = "1.1"
   * @returns {string}
   * @example _toFixed(1.335,2);
  */
  function _toFixed(num, len, round, padding) {
    num = Number(num);
    if (len < 0) {
      throw new RangeError("digits argument must be between 0 and 100");
    }
    let numStr = String(num), //数字转字符串
      pointIndex = numStr.indexOf("."), //小数点下标
      preNumIndex = pointIndex + len + 1; //保留位后一位数字下标
    if (numStr.includes("e") || pointIndex === -1) {
      //遇到科学表示法或整数,直接返回原生toFixed处理结果
      return num.toFixed(len);
    }
    let addZeroCount = len - (numStr.length - pointIndex - 1); //需补0的个数
    if (addZeroCount > 0) {
      numStr += "0".repeat(addZeroCount); //小数位不足后补0
    }
    let numCut = Math.abs(numStr.substring(0, preNumIndex)); //截取保留位(含)前的所有字符
    let res =
      (num < 0 ? "-" : "") +
      (round && numStr[preNumIndex] >= 5
        ? numCut + 1 / Math.pow(10, len)
        : numCut
      ).toFixed(len); //判断预期小数位后一位是否大于等于5,是则进位
    return padding ? res : String(Number(res));
  }
  console.log(_toFixed(123.456, 2, false, true), "是否四舍五入自我控制");

  

posted @ 2020-07-28 22:42  沁猿春  阅读(558)  评论(0编辑  收藏  举报