2012-02-17 78 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