個人對於JavaScript中Number.toFixed()方法的理解

wait.發表於2018-10-26

需求:對浮點數進行四捨五入精度獲取。

問題:直接使用Number.toFixed()會出現異常的舍入情況。

原因:計算機浮點數儲存是二進位制,jsNumber.toFixed()實際的精度確認規則是四捨六入五成雙,逢四下舍,逢六入一,逢五時,根據瀏覽器核心計算結果也不盡相同。

   具體原理這裡不做詳細描述,各位看官可自行查閱相關資料。

解決方法:重新Number.toFixed()方法。

實現原理:將浮點數轉化為整數,保留所需位數,再轉為浮點數。

實現程式碼:

Number.prototype.toFixed = function (length) {
    var s = this + '';
    var len = length || 0;
    var result = s;
    var arr = s.split('.');

    //整數
    if (arr.length < 2) {
        if (len > 0) {
            result += '.';
            for (var i = 1; i <= len; i++) {
                result += '0';
            }
        }
        return result;
    }

    //小數
    var first = arr[0];
    var second = arr[1];

    //小數點位數等於length
    if (second.length == len) {
        return result;
    }

    //小數點位數小於length
    if (second.length < len) {
        for (var k = 1; k <= len - second.length; k++) {
            result += '0';
        }
        return result;
    }

    //小數點位數大於length
    result = first + second.substr(0, len + 1);
    var last = Math.floor((result * 1 + 5) / 10);
    result = (last / Math.pow(10, len)).toFixed(len);
    return result;
};
複製程式碼

備註:解決方案有很多種,這只是個人的理解,僅供參考。

相關文章