2011-12-06 67 views
4

我需要雙值四捨五入到2位數。 什麼是可取的?Math.Round與String.Format

String.Format("{0:0.00}", 123.4567);  // "123.46" 
Math.Round(123.4567, 2)     // "123.46" 
+0

那麼他們需要是不一樣的,所以你可能更喜歡'Math.Round'並使用其舍入選項,還要檢查該[字符串格式四捨五入(HTTP://計算器。 com/questions/2226081/why-does-net-use-a-rounding-algorithm-in-string-format-that-is-inconsistent-wit) – V4Vendetta

+0

關於你將貨幣存儲爲double的機會,你應該真的考慮使用十進制。 http://msdn.microsoft.com/en-us/library/364x0z75%28v=vs.80%29.aspx – spender

+4

'數學。數字> 0的圓形(雙數,數字)在概念上非常不潔。我認爲它不應該被使用。 'double'是一個二進制浮點數,因此沒有明確定義的十進制數的概念。如果您需要將數字四捨五入到一定數量的小數位,請使用「小數」而不是「Double」。 – CodesInChaos

回答

6

它們是不同的功能,如果需要輸出顯示,請使用第一個(也會強制顯示小數)。您將避免不可避免的.ToString()的開銷,如果該變量是double類型的話,將會發生這種開銷。

注意,第二輪一個數字,但如果它是一個整數的結果,你會得到公正的整數(即:7 VS 7.00),這取決於你想用它做什麼

1

前者輸出字符串,後者是雙字符串。你對結果有什麼用處?這個答案會給出你的問題的答案。

4

String.Format將返回一個字符串,Math.Round(double)將返回一個double。

0

如果要將此值作爲字符串返回,則String.Format更好,並且如果要在此情況下將該值作爲double返回,則Math.Round更好。它完全取決於你的要求。

10

Math.Round(double,digits)數字> 0在概念上非常不潔。但我認爲它不應該被使用。 double是一個二進制浮點數,因此沒有明確定義的十進制數字的概念。

我建議使用string.Format,或者只是ToString("0.00")時,你只需要一輪十進制顯示目的,decimal.Round如果你需要(在進一步的計算中使用它,例如)四捨五入的實際數量。

注意:使用decimal.Round您可以指定MidpointRounding模式。通常要求AwayFromZero舍入,而不是ToEven舍入。

隨着ToEven四捨五入0.005m被四捨五入到0.000.015被四捨五入爲0.02。這不是大多數人所期望的。

比較:

  • ToEven:3.75幾輪3.8
  • ToEven:3.85回合3.8(這是不是大多數人期望的那樣)
  • AwayFromZero:3.75幾輪3.8
  • AwayFromZero:3.85回合到3.9

更多信息,請參見:https://msdn.microsoft.com/en-us/library/system.math.round.aspx

+0

...如果我不是「大多數人」,該怎麼辦? –