我正在尝试以可靠的方式实现 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];
};
我最好的选择是字符串操作,因为你不会弄乱浮点数的不确定性,尽管调试比我想象的要难,而且我开始相信我永远不会让它完美。除了这些之外,还有其他人已经实施了吗?