2017-06-26 76 views
1

我在XSLT中取整和在C#中舍入時出現了奇怪的差異。C#和XSLT舍入差異

<xsl:value-of select="round(325 div 50) * 50" /> 

給了我350

但在C#這樣

Math.Round(325/50) * 50 

給我300!

任何想法如何使C#版本的行爲與XSLT版本相同?

回答

0

Math.Round向最接近的甚至發送數值按照https://msdn.microsoft.com/en-us/library/3s2d3xkk(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/wyk4d9cy(v=vs.110).aspx

最接近的整數。如果a的小數部分在兩個整數之間的一半爲 ,其中一個是偶數,另一個是奇數,則返回偶數。

這就是着名的Banker's Rounding

如果這不是您期望的行爲,您可以按照https://msdn.microsoft.com/en-us/library/ef48waz8(v=vs.110).aspx指定要舍入的方式。

Math.Round((double)325/50, MidpointRounding.AwayFromZero) * 50 
+0

這工作完美,並感謝解釋和鏈接。 – Ambuj

+1

我認爲這個解釋忽略了OP的一部分問題,那就是他正在進行整數除法。 'Math.Round(349/50)* 50'也會給出'300'。 –

+0

'Math.Round(349/50)* 50'實際上並沒有編譯(試試看@MarkDickinson) - 這就是爲什麼我改變它以在我的答案中包含雙重演員。 – mjwills