我的印象是,以这种格式声明和初始化浮点数是合法和传统的:
float someVariable = 12.502D; (or M, F does not give a compiler error).
但是我得到一个编译器错误:
双类型的文字不能隐式转换为“浮点”类型;使用“F”后缀创建此类型的文字。
C#中有三种类型的浮点数,对吧?
为了修复编译器错误,我显式强制转换了赋值语句:
float SomeVariable = (float) 12.525D;
在这种情况下我做了正确的事情吗?声明和初始化由Double或Decimal值组成的浮点变量的常规或正确方法是什么?
简单地说,编译器为文本字符串12.502假定的默认类型是double。双精度是浮点数的两倍,就像夸脱装不下一品脱一样,双精度不能存储在浮点数中,除非你做强制转换,否则会有丢失精度的风险。
您可以通过添加F或f后缀告诉编译器12.502实际上是一个浮点数,如下所示:
float someVariable = 12.502f;
或者:
double someVariable = 12.502;
你为什么不使用:
float someVariable = 12.502f;
或
double someVariable = 12.502; //floating point literals are by default doubles
flot
是单精度浮点运算,在C#中不能隐式转换为double
。在C#中,任何可能丢失某些信息的强制转换都不能隐式。flot
有32位来存储浮点精度的组件。double
有64位。
flot
可以取1.5×10^-45
到3.4×10^38
的值
double
可以取5.0×10^-324
到1.7×10^308
的值
因此,您可以看到double可以存储更大范围的值。因此,如果您从double
转换为flot
,您可能会丢失信息。
如果您编写floatyVariable=(floaty)12.525D;
,则十进制数字首先转换为双精度,然后转换为浮点数。在极少数情况下,根据数字,此双舍入会略微改变值。
使用F后缀编写数字可以避免这种情况。
(如果数字在某种意义上是均匀分布的,这将在230中发生大约一次,因为浮点有效数比双精度有效数少29位。当原始数字以双精度舍入到浮点舍入[在229中一次]的中点时,问题就会发生,但如果直接舍入到浮点,则会从中点舍入到[二次一次]的另一个方向舍入。)