JavaScript的「Number.toFixed」的默認實現似乎有點失敗。破壞到固定實現
console.log((8.555).toFixed(2)); // returns 8.56
console.log((8.565).toFixed(2)); // returns 8.57
console.log((8.575).toFixed(2)); // returns 8.57
console.log((8.585).toFixed(2)); // returns 8.59
我需要一個比這更一致的舍入方法。
在8.500和8.660之間的範圍內,下列數字不能正確舍入。
8.575
8.635
8.645
8.655
我試着修復原型實現如下,但它只是在那裏的一半。任何人都可以提出任何可以使其工作更一致的改變嗎?
Number.prototype.toFixed = function(decimalPlaces) {
var factor = Math.pow(10, decimalPlaces || 0);
var v = (Math.round(this * factor)/factor).toString();
if (v.indexOf('.') >= 0) {
return v + factor.toString().substr(v.length - v.indexOf('.'));
}
return v + '.' + factor.toString().substr(1);
};
我可以想象這是一個浮點精度錯誤。 – 2011-03-30 18:46:12
[http://stackoverflow.com/questions/566564/javascript-functions-math-round0-vs-tofixed0-and-browser-inconsistencies](http://stackoverflow.com/questions/566564/javascript-functions-math -round0-vs-tofixed0和瀏覽器不一致)類似? – Prescott 2011-03-30 18:55:09
我剛剛在Chromium V12.0上試過上面的例子,並收到以下結果:8.55 8.56 8.57 8.59。所以你的里程可能會有所不同,這取決於你的JavaScript實現。 – HBP 2011-03-30 19:10:51