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