js 保留2位小數 四舍五入Math.toFixed() bug


1 toFixed方法

toFixed方法可以把Number四舍五入位指定小數位數的數字。但是其四舍五入的規則與數學中的規則不同,使用的是銀行家舍入規則。

銀行家舍入:

四舍六入五取偶(四舍六如五留雙),簡單就是說:四舍六入五考慮,五后非0進1,五后為0看奇偶,五前為偶應舍去,五前為奇要進1.

> (3.61).toFixed(1)    //四舍
'3.6'
> (3.69).toFixed(1)    //六入
'3.7'
> (3.651).toFixed(1)    //五考慮,五后非零,進
'3.7'
> (3.65).toFixed(1)    //五考慮,五后為零,五前為偶數,舍去
'3.6'
> (3.75).toFixed(1)    //五考慮,五后為零,五前為奇數,進
'3.8'

顯然這種規則不符合我們平常在數據中處理的方式。我們可以使用Math.round()方法進行自定義式的實現

round()方法可把一個數字舍入為最接近的整數。跟數學中的取舍的規則一樣。對於0.5該方法進行上舍入;

實例
把不同的數舍入為最接近的整數:

Math.round(0.60)//1
Math.round(0.50) //1
Math.round(0.49)//0
Math.round(-4.40) //-4
Math.round(-4.60)//-5

 

可以利用round方法對數字進行四舍五入的處理:

Number.prototype.toFixed = function(d) {
var  changeNum=this+'';//把數字轉為字符串
if(changeNum.indexOf('-')!=-1)//判斷是否是負數
changeNum=Math.abs(changeNum);
      changeNum = (Math.round(changeNum * Math.pow(10, d)) / Math.pow(10, d)).toString();
    
    var index = changeNum.indexOf('.');//判斷字符是否有小數點
    if (index == -1) {//如果沒有小數點,加上對應個數的小數點
        changeNum += '.';
        changeNum += new Array(d+1).join('0');
    } else if (index > 0) {//如果有,index是小數點的坐標值,比如在第二位index=1
        var temp = d - (changeNum.length - index - 1);//小數點后的位數小於要取舍的個數,用0補齊;數字的長度-小數點的坐標值-1=小數的位數(小數點也占以為,4.00 length:4;.的index是1)
        if (temp > 0) {
            changeNum += new Array(temp+1).join('0');
        }

    }
      if (this.toString().indexOf('-') != -1) {//如果是負數,加上-
        changeNum = "-" + changeNum;
    }
    return changeNum;
}

解析:

this*Math.pow(10,s)//把要處理的數字乘以100*要取舍的位數,變成整數,舒勇Math.round()進行取舍,再除於100*要取舍的位數;
比如對數字保留2位數:

Math.round(3.555*100)/100//3.56

 

 

 

 

參考:https://blog.csdn.net/Archimelan/article/details/83017518

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM