美文网首页
toFixed四舍五入出现的问题

toFixed四舍五入出现的问题

作者: Qummy | 来源:发表于2020-06-24 16:05 被阅读0次

    toFixed是Javascript中常用来将number 四舍五入为指定小数位数的方法。

    例如:

    image

    但是在实际运用中发现在四舍五入那一位为5时,出现了一点问题,例如下图中1.045进位出现的问题

    image

    toFeixd在进位时如果需要进位的末尾是5,如果5后不存在或是0则不进位,否则进位。

    重写代码:

    export function toFixedFun (data, len){
      // debugger
      const number = Number(data);
      if (isNaN(number) || number >= Math.pow(10, 21)) {
        return number.toString();
      }
      if (typeof (len) === 'undefined' || len === 0) {
        return (Math.round(number)).toString();
      }
      let result = number.toString();
      const numberArr = result.split('.');
    
      if (numberArr.length < 2) {
        // 整数的情况
        return padNum(result);
      }
      const intNum = numberArr[0]; // 整数部分
      const deciNum = numberArr[1];// 小数部分
      const 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,要进位
        const times = Math.pow(10, len); // 需要放大的倍数
        let changedInt = Number(result.replace('.', ''));// 截取后转为整数
        changedInt++; // 整数进位
        changedInt /= times;// 整数转为小数,注:有可能还是整数
        result = padNum(`${changedInt }`);
      }
      return result;
      // 对数字末尾加0
      function padNum(num) {
        const dotPos = num.indexOf('.');
        if (dotPos === -1) {
          // 整数的情况
          num += '.';
          for (let i = 0; i < len; i++) {
            num += '0';
          }
          return num;
        } else {
          // 小数的情况
          const need = len - (num.length - dotPos - 1);
          for (let j = 0; j < need; j++) {
            num += '0';
          }
          return num;
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:toFixed四舍五入出现的问题

          本文链接:https://www.haomeiwen.com/subject/opilfktx.html