3

我正在尝试以可靠的方式实现 toFixed() 以四舍五入到小数位(当前的 toFixed() 函数在不同的浏览器中返回不同的结果)。

我的想法是用Number.prototype.toFixed = function(c){};

我尝试了很多选择,只有一个似乎可以正常工作,但我对此没有信心:

通过多次乘/除以 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

1

这是我使用的代码:

function RoundNumber(input, numberDecimals)
{
  numberDecimals = +numberDecimals || 0; // +var magic!

  var multiplyer = Math.pow(10.0, numberDecimals);

  return Math.round(input * multiplyer) / multiplyer;
}

例子:

console.log( RoundNumber(1234.6789, 0) ); // prints 1234
console.log( RoundNumber(1234.6789, 1) ); // prints 1234.6
console.log( RoundNumber(1234.6789, 2) ); // prints 1234.67
console.log( RoundNumber(1234.6789, -1) ); // prints 1230

我在 Chrome 和 Firefox 中使用过它。

于 2013-09-25T23:42:48.427 回答