5

誰能請向我解釋這裏發生了什麼:C#float精度

using System; 
using System.Text; 

namespace ConsoleApplication1 { 

    class Program { 

     static void Main(string[] args) { 

      object o = 1000000.123f; 
      float f= Convert.ToSingle(o); 
      double d = Convert.ToDouble(f); 

      Console.WriteLine(f.ToString("r")); 
      Console.WriteLine(d.ToString("r")); 

      Console.ReadLine(); 

     } 
    } 
} 

,輸出:

1000000.13

1000000.125

我預計:

對象O有一個潛在的浮動類型(似乎發生[觀察手錶w indow它的類型爲對象{}浮動)

這1000000.123f會被存儲f中爲1000000.125(IEEE754的近似在32位?)

,雙將存儲1000000.125以及(似乎發生即使f似乎並不包含我所期望的)

在ToString上要求往返格式會使我在兩種情況下返回1000000.125。

任何人都可以告訴我什麼我做錯了,以獲得1000000.13時,串出f?

回答

5

正如您已經觀察到的,數字1000000.123被存儲爲1000000.125。這是由double.ToString()按原樣呈現,但截斷了float.ToString(),因爲顯示太多數字會造成誤導。

順便說一句,沒有Convert.ToSingle(float),因爲它只是返回你傳入的內容。你的代碼實際上是解析爲Convert.ToSingle(double)。因此,您(隱含地)轉換爲double,然後(明確)回到float,這本質上是無操作的。

注意:不要相信JavaScript浮點計算器。他們中的一些人聲稱1000000.123被單精度浮點數存儲爲1000000.1,我猜測這是基於這樣的假設,因爲IEEE浮點數大約有7.22位的精度,所以它們可以用8位精確表示。這是不正確的。

+0

感謝您的答案(和擡頭重新:我的轉換nop)。有沒有float.ToString()不是四捨五入的數字?截斷會不會導致1000000.12? –

+0

@StephenEmm:當它在兩個表示之間的中間位置時,它會向上(或遠離零 - 不確定哪一個 - 但對於正數沒有區別)。 –