我认为以这种格式声明和初始化浮点数是合法和传统的:
float someVariable = 12.502D; (or M, F does not give a compiler error).
但是我收到编译错误:
double类型的文字不能隐式转换为'float'类型;使用'F'后缀来创建此类型的文字。
C#中有三种类型的浮点数,对吧?
为了修复编译器错误,我明确地使用了赋值语句:
float SomeVariable = (float) 12.525D;
在这种情况下我做对了吗?什么是传统或正确的方法来声明和初始化由Double或Decimal值组成的浮点变量?
答案 0 :(得分:7)
在简洁的英语中,编译器为文本字符串12.502假定的默认类型是double。双倍是浮点数的两倍,就像夸脱不能放入一品脱一样,双重不能存储在浮点数中,除非你进行施法,否则可能会失去精度。
您可以通过添加F或f后缀来告诉编译器12.502实际上是一个浮点数:
float someVariable = 12.502f;
或者:
double someVariable = 12.502;
答案 1 :(得分:1)
你为什么不用:
float someVariable = 12.502f;
或
double someVariable = 12.502; //floating point literals are by default doubles
float
是单精度浮点运算,无法在C#中隐式转换为double
。
在C#中,每个可能丢失一些信息的演员都不能隐含。 float
有32位来存储浮点精度的组件。 double
有64位。
float
可以从1.5 × 10^-45
到3.4 × 10^38
double
可以从5.0 × 10^-324
到1.7 × 10^308
所以你可以看到双打可以存储更大范围的值。
因此,如果您从double
转换为float
,则可能会丢失信息。
答案 2 :(得分:0)
如果你写float SomeVariable = (float) 12.525D;
,那么十进制数字首先转换为double,然后转换为float。在极少数情况下,根据数字,此双舍入会稍微改变该值。
使用F后缀编写数字可以避免这种情况。
(如果数字在某种意义上是均匀分布的,那么在2 30 中大约会发生一次,因为浮点有效数中的位数少于双有效数字中的29位。问题发生在原始数字以双倍的方式圆整到圆形的中间点[在2 29 ]中的一次,但是如果直接圆形浮动,则从另一个方向的圆形向外圆四舍五入到[两次一次]。)