2012-02-17 77 views
4

是否需要在啓動float類型變量時指定fc中的float和double#

float a =3455.67f; 

如果我宣佈並啓動它作爲

float a = 3455.67; 

那麼會發生什麼?

+7

你試過了嗎? – samn 2012-02-17 11:09:54

+1

@samm是否則編譯器給出錯誤「字面值double不能隱式轉換爲類型'float';使用'F'後綴來創建此類型的字面值」。 – Eljay 2012-02-17 11:11:45

+3

這個問題應該被重寫爲「爲什麼是強制性的」而不是「會發生什麼」 – 2012-02-17 11:21:34

回答

4

documentationfloat說:

默認情況下,一個真正的數字文字的賦值操作符 被視爲double的右側。因此,要初始化一個變量,請使用後綴fF

這意味着,如果你做float a = 3455.67;那麼編譯器將拒絕隱含的double轉換爲float

+0

我總是想知道爲什麼這是一個強制性的語法。顯然,在編譯器級別真正發生的事情是,在將相等操作的右側分配給左側類型之前,首先將其指定爲雙側。這聽起來很奇怪,因爲F使明確的左「浮動」鍵入條件 – 2012-02-17 11:34:57

+0

更有趣的文檔,這是必需的,因爲double不隱式地轉換爲浮動(或有趣的是,其他任何東西)。請參閱http://msdn.microsoft.com/en-us/library/y5b434w4.aspx – BradleyDotNET 2014-05-30 19:13:49

2

默認情況下,賦值運算符右側的實數字面值被視爲double。因此,初始化浮點變量,使用後綴F或F,如下面的例子:

float x = 3.5F; 

如果你沒有在以前的聲明中使用的後綴,你會得到一個編譯錯誤,因爲你試圖將一個double值存儲到一個float變量中。

更多細節看msdn

+0

-1:從MSDN複製/粘貼沒有更多的東西是不是真的要走的路。 – Jon 2012-02-17 11:14:17

+1

是的我知道,但更好地給這裏提供一些信息,只有鏈接到msdn鏈接的URL鏈接一段時間後可以被打破 – Serghei 2012-02-17 11:23:06

2

此:

float a = 3455.67; 

將無法​​編譯。 3455.67是一個雙常量,C#將允許您將該值賦給一個浮點型變量。

用途:

float f = (float)3455.67; 

否則你就必須指定 「F」 格式後綴。

+0

爲什麼浮動雙重轉換考慮擴大,而雙浮動不是?邏輯上,反過來應該是真實的,例如, (float)((double)0.1)和(float)((double)1E38 * 10.0)將產生(float)0.1和(float)+ INF [意味着大於3。4E38],兩者都是正確的。相反,(double)(0.1f)或(double)((float)1E38f * 10.0f)會產生(double)0.10000000149011612和(double)+ INF [意味着大於1.79E308的東西],這兩者都是錯誤的。從較具體的類別轉換爲較不具體的類別正在擴大,而反轉類型正在縮小。爲什麼漂浮在後面? – supercat 2012-03-20 17:45:29