问题描述
toFixed是Javascript中常用来将number 四舍五入为指定小数位数的方法。
例如:
但是在实际运用中发现在四舍五入那一位为5时,出现了一点问题,例如下图中1.045进位出现的问题
toFeixd在进位时如果需要进位的末尾是5,如果5后不存在或是0则不进位,否则进位。
解决办法
如下,重写toFixed
exportfunctiontoFixedFun (data, len){ // debuggerconstnumber=Number(data); if (isNaN(number) ||number>=Math.pow(10, 21)) { returnnumber.toString(); } if (typeof (len) ==='undefined'||len===0) { return (Math.round(number)).toString(); } letresult=number.toString(); constnumberArr=result.split('.'); if (numberArr.length<2) { // 整数的情况returnpadNum(result); } constintNum=numberArr[0]; // 整数部分constdeciNum=numberArr[1];// 小数部分constlastNum=deciNum.substr(len, 1);// 最后一个数字if (deciNum.length===len) { // 需要截取的长度等于当前长度returnresult; } if (deciNum.length<len) { // 需要截取的长度大于当前长度 1.3.toFixed(2)returnpadNum(result); } // 需要截取的长度小于当前长度,需要判断最后一位数字result=`${intNum}.${deciNum.substr(0, len)}`; if (parseInt(lastNum, 10) >=5) { // 最后一位数字大于5,要进位consttimes=Math.pow(10, len); // 需要放大的倍数letchangedInt=Number(result.replace('.', ''));// 截取后转为整数changedInt++; // 整数进位changedInt/=times;// 整数转为小数,注:有可能还是整数result=padNum(`${changedInt}`); } returnresult; // 对数字末尾加0functionpadNum(num) { constdotPos=num.indexOf('.'); if (dotPos===-1) { // 整数的情况num+='.'; for (leti=0; i<len; i++) { num+='0'; } returnnum; } else { // 小数的情况constneed=len- (num.length-dotPos-1); for (letj=0; j<need; j++) { num+='0'; } returnnum; } } }