手写一个四舍五入的方法,不管保留小数点后几位,都能符合四舍五入的要求

实现某个数的四舍五入,有专门的使用方法:toFixed()。

const num = 12.38484
const newNum = Number(num.toFixed(3))
console.log(newNum)//12.385

如果手写怎么实现相同的功能呢?
先试验保留2位小数的情况。

function toRounding(data){
      let num = typeof data === 'string'?data:String(data)
      const pattern = new RegExp('[0-9]+') //正则表达式匹配数字
      const pattern1 = new RegExp("[\u4E00-\u9FA5]+") //正则表达式匹配汉字
      const pattern2 = new RegExp("[a-zA-Z]+") //正则表达式匹配英文字母
      if(typeof num === 'string' && pattern.test(Number(num)) && num.includes('.')){ //假如num='123.xxx'这种形式的
          //获取小数点后第一位的那个数
          let  number1 = Number(num.substr(num.indexOf('.')+1,1))
          //获取小数点后第二位的那个数
          let  number2 = Number(num.substr(num.indexOf('.')+2,1))
          //获取小数点后第三位的那个数
          let index = num.indexOf('.') + 3
          let number3 = Number(num.substr(index,1))
          //选择数字保留小数点后两位
          let str1 = num.substr(0,num.indexOf('.')+3)
          // 将获得的小数转为数组
           let arr = str1.split('')
           if(number2>=5 && number2<=9){ //如果小数点后第三位的那个数大于等于5且小于等于9,那么小数点后的第二位那个数加1
                number1+=1
                if(number2===10){ //出现123.498这种情况的时候要考虑
                    number2 = 0
                    number1+=1
                    arr[num.indexOf('.')+1] = number1
                }
                arr.pop()
                arr.push(number2)
                let str2 = arr.join('')
                return Number(str2)
            }else{ //否则不用加1
                return Number(str1)
            }
       }else if(pattern1.test(num)||pattern2.test(num)){ //当参数是汉字或者英文字母时
            return NaN
       }else{
            return Number(num)
       }
}
console.log(toRounding('12.34567'))//结果:12.35
console.log(toRounding('123.498'))//123.5

那对于不管是保留小数点后几位,同时又要符合四舍五入的要求,只需要在原代码上修改。

function toRounding(data,digital){
      let num = typeof data === 'string'?data:String(data)
      const pattern = new RegExp('[0-9]+') //正则表达式匹配数字
      const pattern1 = new RegExp("[\u4E00-\u9FA5]+") //正则表达式匹配汉字
      const pattern2 = new RegExp("[a-zA-Z]+") //正则表达式匹配英文字母
      if(typeof num === 'string' && pattern.test(Number(num)) && num.includes('.')){ //假如num='123'这种形式的
        //获取小数点后第digital-1位的那个数
          let  number1 = Number(num.substr(num.indexOf('.')+(digital-1),1))
          //获取小数点后第digital位的那个数
          let  number2 = Number(num.substr(num.indexOf('.')+digital,1))
          //获取小数点后第(digital+1)位的那个数
          let index = num.indexOf('.') + (digital+1)
          let number3 = Number(num.substr(index,1))
          //选择数字保留小数点后digital位
          let str1 = num.substr(0,num.indexOf('.')+(digital+1))
          // 将获得的小数转为数组
           let arr = str1.split('')
           if(number3>=5 && number3<=9){ //如果小数点后第(digital+1)位的那个数大于等于5且小于等于9,那么小数点后的第digital位那个数加1
                number2+=1
                if(number2===10){ //出现123.498这种情况的时候要考虑
                    number2 = 0
                    number1+=1
                    arr[num.indexOf('.')+1] = number1
                }
                arr.pop()
                arr.push(number2)
                let str2 = arr.join('')
                return Number(str2)
            }else{ //否则不用加1
                return Number(str1)
            }
       }else{
            return NaN
       }
}
console.log(toRounding(12.35561,4)) //12.3556
console.log(toRounding(12.9348,3))//12.935
console.log(toRounding('哈哈哈'))//NaN

你可能感兴趣的:(手写一个四舍五入的方法,不管保留小数点后几位,都能符合四舍五入的要求)