個人はJavaScriptの中でNumber.toFixed()方法の理解について

1922 ワード

需要:浮動小数点を四捨五入精度で取得します.
問題: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;
};
備考:解決案はいろいろありますが、これは個人的な理解です.ご参考ください.