原生JS实现四舍五入
在使用原有JS的 toFixed 实现 四舍五入时,如果位数过多,并且最后一位不为0时,四舍五入不准备,所以动手写了一个四舍五入的方法,经过2个阶段
1:正整数四舍五入
2:负数四舍五入
如果需要实现 四舍五入 ,只需要将下边的代码引入即可
1 //toFixed兼容方法,四舍五入 2 Number.prototype.toFixed = function (len) { 3 if (len > 20 || len < 0) { 4 throw new RangeError('toFixed() digits argument must be between 0 and 20'); 5 } 6 // .123转为0.123 7 var number = Number(this); 8 if (isNaN(number) || number >= Math.pow(10, 21)) { 9 return number.toString(); 10 } 11 if (typeof (len) == 'undefined' || len == 0) { 12 return (Math.round(number)).toString(); 13 } 14 var result = number.toString(), 15 numberArr = result.split('.'); 16 17 if (numberArr.length < 2) { 18 //整数的情况 19 return padNum(result); 20 } 21 var intNum = numberArr[0], //整数部分 22 deciNum = numberArr[1],//小数部分 23 lastNum = deciNum.substr(len, 1);//最后一个数字 24 25 if (deciNum.length == len) { 26 //需要截取的长度等于当前长度 27 return result; 28 } 29 if (deciNum.length < len) { 30 //需要截取的长度大于当前长度 1.3.toFixed(2) 31 return padNum(result) 32 } 33 //需要截取的长度小于当前长度,需要判断最后一位数字 34 result = intNum + '.' + deciNum.substr(0, len); 35 if (parseInt(lastNum, 10) >= 5) { 36 //最后一位数字大于5,要进位 37 var times = Math.pow(10, len); //需要放大的倍数 38 var changedInt = Number(result.replace('.', ''));//截取后转为整数 39 var fu = 1/changedInt < 0;// 为true 时,则 changedInt < 0 或者 changedInt = -0,否则为正数或等于0 40 if(fu){ 41 changedInt--;//整数进位 42 }else{ 43 changedInt++;//整数进位 44 } 45 changedInt /= times;//整数转为小数,注:有可能还是整数 46 result = padNum(changedInt + ''); 47 } 48 return result; 49 //对数字末尾加0 50 function padNum(num) { 51 var dotPos = num.indexOf('.'); 52 if (dotPos === -1) { 53 //整数的情况 54 num += '.'; 55 for (var i = 0; i < len; i++) { 56 num += '0'; 57 } 58 return num; 59 } else { 60 //小数的情况 61 var need = len - (num.length - dotPos - 1); 62 for (var j = 0; j < need; j++) { 63 num += '0'; 64 } 65 return num; 66 } 67 } 68 }