浮点数C#

时间:2013-01-12 09:15:20

标签: c# floating-point

我认为以这种格式声明和初始化浮点数是合法和传统的:

float someVariable = 12.502D;  (or M, F does not give a compiler error).

但是我收到编译错误:

  

double类型的文字不能隐式转换为'float'类型;使用'F'后缀来创建此类型的文字。

C#中有三种类型的浮点数,对吧?

  1. F或f表示浮动。 (7位有效数字)
  2. D或d代表Double。 (15或16位有效数字)
  3. M或m表示十进制。 (28或29位有效数字)
  4. 为了修复编译器错误,我明确地使用了赋值语句:

    float SomeVariable = (float) 12.525D;
    

    在这种情况下我做对了吗?什么是传统或正确的方法来声明和初始化由Double或Decimal值组成的浮点变量?

3 个答案:

答案 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^-453.4 × 10^38

取值

double可以从5.0 × 10^-3241.7 × 10^308

取值

所以你可以看到双打可以存储更大范围的值。 因此,如果您从double转换为float,则可能会丢失信息。

答案 2 :(得分:0)

如果你写float SomeVariable = (float) 12.525D;,那么十进制数字首先转换为double,然后转换为float。在极少数情况下,根据数字,此双舍入会稍微改变该值。

使用F后缀编写数字可以避免这种情况。

(如果数字在某种意义上是均匀分布的,那么在2 30 中大约会发生一次,因为浮点有效数中的位数少于双有效数字中的29位。问题发生在原始数字以双倍的方式圆整到圆形的中间点[在2 29 ]中的一次,但是如果直接圆形浮动,则从另一个方向的圆形向外圆四舍五入到[两次一次]。)