2009-12-07 63 views
7

我從閱讀this Stackoverflow question得知,編譯器會查看你的編號,確定中點是偶數還是奇數,然後返回偶數。示例數字是2.5,取整爲3.我嘗試了自己的小實驗來看看會發生什麼,但我還沒有找到任何關於此的規範,或者即使它在瀏覽器之間是一致的。Javascript Math.Round到C#Math.Round的接近程度如何?

下面是一個例子使用jQuery用於顯示JavaScript代碼段:

$(document).ready(function() { 
    $("#answer").html(showRounding()); 
}); 

function showRounding() { 
    var answer = Math.round(2.5); 
    return answer; 
} 

這將返回一個 '3'。

我想知道的是:JavaScript中的四捨五入與C#等效的距離有多近?我這樣做的原因是因爲我想採用一種使用Math.Round的JavaScript方法,並將相同的方法重寫到C#中,並希望知道在四捨五入之後我可以得到相同的結果。

回答

5

這裏的the complete javascript specificationMath.round(x)

15.8.2.15輪(x)返回的數值,是最接近x且 等於某個整數。如果 兩個整數值相等,則 接近x,則結果爲 數值接近+∞。如果 x已經是一個整數,結果是 x。

  • 如果x是NaN,結果是NaN。
  • 如果x是+0,結果是+0。
  • 如果x爲-0,則結果爲-0。
  • 如果x是+∞,結果是+∞。
  • 如果x是-∞,則結果是-∞。
  • 如果x大於0但小於 0.5,則結果爲+0。
  • 如果x小於0但大於或等於-0.5,則結果 爲-0。

注1 Math.round(3.5)返回4,但是 Math.round(-3.5)返回-3。

注2 Math.round(X)的值是 相同,除了當X是-O 或大於或 小於0但越大 Math.floor(X + 0.5),的值等於-0.5;對於這些情況 Math.round(x)返回-0,但是 Math.floor(x + 0.5)返回+0。

The C# Language Specification沒有規定任何特定的舍入算法。最接近的是.NET的文檔Math.Round。從這裏,你可以看到一些javascript情況不適用(Math.Round只能處理小數和雙精度,而不是無窮大),並且方法的重載讓你對結果有更多的控制 - 你可以指定小數位數在結果和中點舍入方法中。默認情況下,Math.Round使用'銀行家舍入'(甚至)。

2

ECMAScript的舍入基本上是天真的asymmetric rounding(添加了檢查+-Infinity)。 WRT移植JavaScript代碼到C#你可能最好避免.NET的Math.Round(因爲它是always symmetric),並使用Math.Floor代替:

double d = -3.5d; 
double rounded = Math.Floor(d + 0.5); // -3 matches JavaScript's Math.round 

,如果你想的ECMAScript的Math.round嚴格的仿真,也就是說。

+0

你說得對。請再看看http://stackoverflow.com/questions/1870441/remove-all-attributes/1870487#1870487 – cletus 2009-12-09 03:23:51

+0

在C#中,您應該使用Round with MidpointRounding.AwayFromZero來保持業務分析師和書記員的快樂。看起來,默認情況下C#Round正在使用銀行家與MidpointRounding的四捨五入。當然,在C#中使用Decimal來獲得金錢。不知道,這將是多麼準確,但在Javascript中,但你不應該依賴Javascript - 服務器是權威。 – JustAMartin 2016-06-17 09:23:35