2016-09-27 13 views
1

請看這2個簡單的代碼和輸出的差異。爲什麼Math.Round舍入和C#中佔位符四捨五入之間的區別?

using System; 

namespace _02.CircleArea 
{ 
    class CircleArea 
    { 
     static void Main(string[] args) 
     { 
      double inputR = double.Parse(Console.ReadLine()); 
      double circleArea = Math.Round((Math.PI * inputR * inputR), 12); 
      Console.WriteLine("{0}", circleArea); 
     } 
    } 
} 

隨着123.456輸出的輸入是47882.2198038791

而且做起來的那種方式:

using System; 

namespace _02.CircleArea 
{ 
    class CircleArea 
    { 
     static void Main(string[] args) 
     { 
      double inputR = double.Parse(Console.ReadLine()); 
      double circleArea = (Math.PI * inputR * inputR); 
      Console.WriteLine("{0:F12}", circleArea); 
     } 
    } 
} 

以相同的輸入123.456它給出了不同的輸出47882.219803879100

爲什麼佔位符舍入和Math.Round舍入結果之間的區別?

+0

@CodeCaster:在這個問題中討論的區別在這裏沒有被觀察到。 –

+2

您從{0}獲得的默認格式可確保顯示的結果不超過15位有效數字。因爲顯示更多將是無意義的,* double *類型不能存儲那麼多數字。它的尾數使用53位,只允許表示2^53個不同的值。當你使用F12時,你會覆蓋廢話規則並獲得17位數字。最後兩個只是隨機噪聲,你不幸的是他們是0.這可能發生,這是一個意外。 –

回答

2

Math.Round實際上給你一個新的數值,而使用格式代碼只是顯示一個四捨五入的值。由於您在第二個格式字符串中指定了12位數字的精度,但不是第一個數字,因此會給出尾隨零。

我想指出,數字格式總是舍從零路程,而Math.Round默認發到最接近的偶數

2

兩者圓整完全相同。不同之處在於顯示尾隨零。由於在第一個代碼片段中,有效數字的數量僅用於舍入,並且不能用於字符串格式化例程,因此您沒有得到尾隨零也就不足爲奇了。

+1

@DStanley:哪一個會出現在其他輸入中。 *使用這些輸入*,兩個函數的圓整完全相同。被問到的問題是關於這些輸入的行爲,即尾隨零或缺乏。 –

+0

好的,我明白你的意思了。刪除我的評論。 –