toFixed四舍五入出現(xiàn)的問題

toFixed是Javascript中常用來將number 四舍五入為指定小數(shù)位數(shù)的方法。

例如:

image

但是在實際運用中發(fā)現(xiàn)在四舍五入那一位為5時,出現(xiàn)了一點問題,例如下圖中1.045進位出現(xiàn)的問題

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) {
    // 整數(shù)的情況
    return padNum(result);
  }
  const intNum = numberArr[0]; // 整數(shù)部分
  const deciNum = numberArr[1];// 小數(shù)部分
  const lastNum = deciNum.substr(len, 1);// 最后一個數(shù)字

  if (deciNum.length === len) {
    // 需要截取的長度等于當前長度
    return result;
  }
  if (deciNum.length < len) {
    // 需要截取的長度大于當前長度 1.3.toFixed(2)
    return padNum(result);
  }
  // 需要截取的長度小于當前長度,需要判斷最后一位數(shù)字
  result = `${intNum}.${deciNum.substr(0, len)}`;
  if (parseInt(lastNum, 10) >= 5) {
    // 最后一位數(shù)字大于5,要進位
    const times = Math.pow(10, len); // 需要放大的倍數(shù)
    let changedInt = Number(result.replace('.', ''));// 截取后轉(zhuǎn)為整數(shù)
    changedInt++; // 整數(shù)進位
    changedInt /= times;// 整數(shù)轉(zhuǎn)為小數(shù),注:有可能還是整數(shù)
    result = padNum(`${changedInt }`);
  }
  return result;
  // 對數(shù)字末尾加0
  function padNum(num) {
    const dotPos = num.indexOf('.');
    if (dotPos === -1) {
      // 整數(shù)的情況
      num += '.';
      for (let i = 0; i < len; i++) {
        num += '0';
      }
      return num;
    } else {
      // 小數(shù)的情況
      const need = len - (num.length - dotPos - 1);
      for (let j = 0; j < need; j++) {
        num += '0';
      }
      return num;
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容