【发布时间】:2011-03-30 18:42:26
【问题描述】:
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);
};
【问题讨论】:
-
我可以想象这是一个浮点精度错误。
-
可能与浮点问题有关,见stackoverflow.com/questions/1458633/…
-
我刚刚在 Chromium V12.0 上尝试了上面的示例并收到以下结果:8.55 8.56 8.57 8.59。所以你的里程可能会根据你的 JavaScript 实现而有所不同。
-
为什么不使用AngularJS修改的Mozilla实现呢?这是一个单行字,实际上是在一个答案中提出的。
标签: javascript