3

toFixed() を実装して、信頼できる方法で小数点以下を四捨五入しようとしています (現在の toFixed() 関数は、ブラウザーごとに異なる結果を返します)。

私の考えはそれを実装することですNumber.prototype.toFixed = function(c){};

私は多くのオプションを試しましたが、うまくいくように見えるのは1つだけですが、自信がありません:

数回 10 で乗算/除算し、丸めることにより ( (0.069).toFixed(2);「0.06999999999999999」を返します):

Number.prototype.toFixed = function(c){
    var c =  isNaN(c = Math.abs(c)) ? 0 : c;
    var n = this;
    for(var i=0; i<c; i++){
        n *= 10;
    }
    n = Math.round(n);
    for(var i=0; i<c; i++){
        n /= 10;
    }
    n = (n+"").split(".");
    if(c==0){
        return n[0];
    }
    if(n[1] == void 0){
        n[1] = "";
    }
    while(n[1].length<c){
        n[1]+="0";
    }
    return n[0]+"."+n[1];
};

(0.0999).toFixed(2)数値を文字列として管理する (たとえば、 「1.10」と表示されるなど、これにはまだバグがあります)

Number.prototype.toFixed = function(c){
    var c =  isNaN(c = Math.abs(c)) ? 0 : c;
        var d = (this+"").split(".");
        if(d[1] == void 0){
            d[1] = "";
        }
        if(d[1].length>c){
            if(parseInt(d[1].charAt(c))>=5){
                var cont = 0;
                while(cont<c-1&&d[1].charAt(cont)==='0'){
                    cont++;
                }
                var temp="";
                while(cont--){
                    temp += "0";
                }
                d[1]=temp+(parseInt(d[1].substring(0,c))+1)+"";
                if(d[1].length>c){
                    d[0]=(parseInt(d[0])+1)+"";
                    d[1]=d[1].substring(1);
                }
            } else {
                d[1] = d[1].substring(0,c);
            }
        }
        if(c==0){
            return d[0];
        }
        while(d[1].length<c){
            d[1]+="0";
        }
        return d[0]+"."+d[1];
};

10 ^ c で乗算/除算して丸めることで、問題は見られませんでしたが、自信がありません。

Number.prototype.toFixed = function(c){
    var c =  isNaN(c = Math.abs(c)) ? 0 : c;
    var n = this;
    var z = "1";
    for(var i=0; i<c; i++){
        z+="0";
    }
    n = Math.round(n*z);
    n /= z;
    n = (n+"").split(".");
    if(c==0){
        return n[0];
    }
    if(n[1] == void 0){
        n[1] = "";
    }
    while(n[1].length<c){
        n[1]+="0";
    }
    return n[0]+"."+n[1];
};

私の最善の策は、フロートの不確実性を台無しにしないため、文字列操作の方法です。ただし、思ったよりもデバッグが難しくなっており、完全にはできないと信じ始めています。他の誰かがこれら以外にすでに実装していますか?

4

1 に答える 1