2011-03-22 54 views
1

我不需要使用Math.round功能,如果它不允許我選擇我想要的小數位數。所以我創建了我使用的以下函數。可以覆蓋默認的Math.round javascript功能嗎?

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。

回答

3

你可以,但我強烈建議不要。根據標準功能,它顯然會破壞任何第三方代碼。

您發佈的特定代碼也具有無限遞歸。您需要存儲原始的Math.round。但是這再次說明了爲什麼不要混淆標準功能。我們都寫錯誤,但最好將它們限制在我們的代碼中。

+0

好點...謝謝!那麼什麼時候使用Math以及什麼時候使用Number是個好時機?我應該在數字中使用數字嗎? – Metropolis 2011-03-22 03:07:50

+0

@Metropolis,我會建議對於在任何核心對象中放置任何方法都非常謹慎。 – 2011-03-22 03:10:48

+0

我是....我幾乎不使用它們,我可能有6個功能?除此之外,我還沒有遇到任何我需要放在這裏的人。但對於我所擁有的人來說,我希望他們能夠在最好的地方。 – Metropolis 2011-03-22 03:11:54

0

如果您100%確定您對任何其他地方的Math.round沒有任何用處,然而最好不要做這個假設。像這樣一個常見功能的猴子修補幾乎可以變得很好。

您使用的外部庫可能會很好地使用此方法,這會使事情變得糟糕。

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/

+0

我將在示例中使用它(因爲我使用無限遞歸進行設置)。謝謝! – Metropolis 2011-03-22 03:15:48

+0

parseInt(精度),whaat? – 2011-03-22 03:29:12

+0

是的,你可能想要避免包含在鏈接/示例中的parseInt,或者至少要小心使用它通過將其更改爲基10 http://stackoverflow.com/questions/850341/workarounds-for-javascript -parseint-octal-bug – sep15ms 2011-03-22 03:58:45

2

我得到一個遞歸的錯誤,當我試試你的函數之前,但短期的是,它的罰款。只要你將精度默認爲零,這意味着如果第二個參數沒有被傳遞,它將起到與原始函數相同的作用,你將不會產生任何效果。

但是,對於最佳實踐,最好只是稱之爲別的東西。

僅供參考,我的版本:

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

是的,我只是改變了代碼而沒有解決:p對此抱歉。 – Metropolis 2011-03-22 03:17:06