实现某个数的四舍五入,有专门的使用方法: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