可以覆盖默认的Math.round javascript功能吗?

时间:2011-03-22 03:05:59

标签: javascript

如果不允许我选择我想要的小数位数,我就不需要使用Math.round功能。所以我创建了以下使用的函数。

Number.prototype.round = function(precision) {
    var numPrecision = (!precision) ? 0 : parseInt(precision, 10);
    var roundedNum = Math.round(this * Math.pow(10, numPrecision)) / Math.pow(10, numPrecision);
    return roundedNum;
};

我的问题是,我可以将其更改为以下内容而不会产生任何影响。

Math.roundP = function(num, precision){
   var pow = Math.pow(10, precision||0);
   return (Math.round(num*pow) / pow);
};

我意识到这将覆盖默认的Math.round功能,但我不需要它。这在Javascript中可以吗?我之前没有这样做,所以我只想看看人们对此的看法。或者对我来说更好的方式就是让它保持原样。

我无法决定何时使用Number.prototype,以及何时使用Math。

5 个答案:

答案 0 :(得分:3)

你可以,但我强烈建议反对它。根据标准功能,它显然会破坏任何第三方代码。

您发布的特定代码也具有无限递归。您需要存储原始Math.round。但这又说明了为什么不搞乱标准功能。我们都写错误,但最好将它们限制在我们的代码中。

答案 1 :(得分:2)

当我尝试你的功能时,我收到一个递归错误,但缺点是它很好。只要你将精度默认为零,意味着如果没有传递第二个参数,它将与原始函数相同,你不会有任何影响。

但是,对于最佳实践,最好将其称为其他内容。

仅供参考,我的版本:

Math.roundP = function(num, precision){
   var pow = Math.pow(10, precision||0);
   return (Math.round(num*pow) / pow);
};

答案 2 :(得分:1)

我之前使用过这种方法

    Math.round = function(number, precision)
{
    precision = Math.abs(parseInt(precision)) || 0;
    var coefficient = Math.pow(10, precision);
    return Math._round(number*coefficient)/coefficient;
}

http://leaverou.me/2009/02/extend-mathround-mathceil-and-mathfloor-to-allow-precision/

答案 3 :(得分:1)

我发现了这个:http://www.mredkj.com/javascript/nfbasic2.html

允许你只说:num.toPrecision(n),你就完成了。

该链接解释了更多。

希望有所帮助。

答案 4 :(得分:0)

如果您100%确定您在其他任何地方都没有使用Math.round,那么最好不要做出这个假设。猴子修补像这样的常见功能几乎可以证明是好的。

您使用的外部库可能会很好地使用此方法,这会搞砸。