在JavaScript中为Number.prototype添加舍入方法

时间:2014-11-20 08:52:45

标签: javascript prototype rounding polyfills

如何简化JavaScript中的舍入?我希望我能以面向对象的方式更优雅地完成它。 toFixed方法运行良好,但没有向后舍入,也返回字符串而不是数字。

pi.toFixed(2).valueOf();
// 3.14

实际上,舍入是一个纠结,因为我必须使用:

pi = Math.round(pi * 100) / 100;
// 3.14

仅仅将方法粘贴到变量的末尾会更好,例如:

pi.round(2);
// 3.1r

2 个答案:

答案 0 :(得分:0)

扩展Number.prototype。 Javascript中的数字是与内置对象“Number”关联的数据类型。添加以下polyfill块:

if (!Number.prototype.round) {
    Number.prototype.round = function (decimals) {
        if (typeof decimals === 'undefined') {
            decimals = 0;
        }
        return Math.round(
            this * Math.pow(10, decimals)
        ) / Math.pow(10, decimals);
    };
}

在此之后的任何地方,您都可以通过将.round()粘贴到它们的末尾来对数字进行舍入。它有一个可选参数,用于确定小数位数。例如:

pi.round(2);

您还可以使用带负数的后向舍入,例如:

x = 54321;
x.round(-4);
// 50000

小提琴:http://jsfiddle.net/g2n2fbmq/

相关:

答案 1 :(得分:0)

首先:不要这样做

扩展内置原型通常是不受欢迎的,因为新标准可能会破坏您的代码。扩展内置原型的库过去曾引起过麻烦。

但是,如果您真的愿意并接受风险,那么添加一个任何标准都不太可能采用的前缀应该是相对安全的。

if (!Number.prototype.$round) {
  Object.defineProperty(Number.prototype, '$round', {
    value(precision) {
      return +this.toFixed(precision)
    },
  })
}

(123.456789).$round(2) // 123.45

通过在属性前加上 $,如果 Number#round() 是标准化的,您的代码将继续工作。

我使用 Object.defineProperty 而不是 =,因为它使属性在默认情况下不可枚举。这意味着它不会出现在 for..in 循环中。