c中的float和double#
的documentation上float
说:
默认情况下,一个真正的数字文字的赋值操作符 被视为
double
的右侧。因此,要初始化一个变量,请使用后缀f
或F
。
这意味着,如果你做float a = 3455.67;
那么编译器将拒绝隐含的double
转换为float
。
我总是想知道为什么这是一个强制性的语法。显然,在编译器级别真正发生的事情是,在将相等操作的右侧分配给左侧类型之前,首先将其指定为双侧。这听起来很奇怪,因为F使明确的左“浮动”键入条件 – 2012-02-17 11:34:57
更有趣的文档,这是必需的,因为double不隐式地转换为浮动(或有趣的是,其他任何东西)。请参阅http://msdn.microsoft.com/en-us/library/y5b434w4.aspx – BradleyDotNET 2014-05-30 19:13:49
此:
float a = 3455.67;
将无法编译。 3455.67是一个双常量,C#将允许您将该值赋给一个浮点型变量。
用途:
float f = (float)3455.67;
否则你就必须指定 “F” 格式后缀。
为什么浮动双重转换考虑扩大,而双浮动不是?逻辑上,反过来应该是真实的,例如, (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
你试过了吗? – samn 2012-02-17 11:09:54
@samm是否则编译器给出错误“字面值double不能隐式转换为类型'float';使用'F'后缀来创建此类型的字面值”。 – Eljay 2012-02-17 11:11:45
这个问题应该被重写为“为什么是强制性的”而不是“会发生什么” – 2012-02-17 11:21:34