在 JavaScript 中向 Number.prototype 添加一个舍入方法



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

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

实际上,舍入有点纠结,因为我必须使用:

pi = Math.round(pi * 100) / 100;
// 3.14
相反,将

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

pi.round(2);
// 3.1r

Extend Number.prototype.Javascript 中的数字是与内置对象"Number"关联的数据类型。添加以下填充物块:

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/

相关:

  • Javascript 将数字转换为不同的格式或字符串替代
  • 在javascript和Math对象中扩展Number.prototype?
  • 整数原型

首先:不要这样做

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

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

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循环中。

最新更新