toFixed四舍五入出现的问题

本文探讨了JavaScript中toFixed()方法在处理四舍五入时遇到的问题,特别是在数字末尾为5的情况下。作者提供了一个重写版的toFixedFun()函数,解决了当需要进位的末尾是5时,如果5后面没有数字或者为0时不进位的错误。该函数考虑了不同长度的小数部分,并根据最后一位数字是否大于5来决定是否进位。通过这个解决方案,可以确保四舍五入操作的正确性。
摘要由CSDN通过智能技术生成

问题描述

toFixed是Javascript中常用来将number 四舍五入为指定小数位数的方法。
例如:
在这里插入图片描述
但是在实际运用中发现在四舍五入那一位为5时,出现了一点问题,例如下图中1.045进位出现的问题
在这里插入图片描述
toFeixd在进位时如果需要进位的末尾是5,如果5后不存在或是0则不进位,否则进位。

解决办法

如下,重写toFixed

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;
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值