首页 > 编程笔记 > C#笔记 阅读:36

C#中的浮点类型(非常详细)

C# 程序设计时,如果需要比较精确地记录数值的变化,即需使用小数点以下数值时,则建议使用浮点数来声明此变量,如平均成绩、温度、里程数等。

在其他高级语言中,人们习惯称浮点数为实数,浮点数有两种,float 是单精度浮点数、double 是双精度浮点数,另外 C# 又多了一般程序语言没有的 decimal(高精度十进制)类型的浮点数。

C#浮点数基本概念

由于 double(双精确度浮点数)和 float(单精度浮点数)之间,除了容量不一样之外,其他均相同,所以在此节我们将其合并讨论,下表展示了浮点数数据类型的概念。

表 1 C#浮点数数据类型表
C# .NET 类型 长 度 数值范围 精确度
float System.Single 32 ±1.5 × 10-45 ~ ± 3.4 × 1038 6 ~ 9 位数
double System.Double 64 ±5.0 × 10-324 ~ ± 1.7308 15 ~ 17 位数
decimal System.Decimal 128 ±1.0 × 10-28 ~ ± 7.9228 × 1028 28 ~ 29 位数

表中长度的单位是位(Bit),8 位等于 1 个字节。

上述数据类型中 decimal 的精确度最高,其特色是由小数点右边的数字数目决定数值的精确度,此类型的数据常被用在财务程序、货币金额(如 $350.00)或利率(如 2.5%)上。此外,decimal 数的另一个特色是会保留小数点右边的 0。

下图是单精度浮点数与双精度浮点数的说明:

若是有一个数字为 0.789,我们可以省略 0,而直接将它改写成 .789。

C#浮点数数据类型的属性

表 1 中的每个浮点数数据类型皆有 MinValue 和 MaxValue 属性,此属性可以显示该浮点数数据类型的最小值和最大值。

【实例】列出浮点数 float、double 和 decimal 的最小值和最大值。
Console.WriteLine($"float 的最大值:{float.MaxValue}");
Console.WriteLine($"float 的最小值:{float.MinValue}");
Console.WriteLine($"double 的最大值:{double.MaxValue}");
Console.WriteLine($"double 的最小值:{double.MinValue}");
Console.WriteLine($"decimal 的最大值:{decimal.MaxValue}");
Console.WriteLine($"decimal 的最小值:{decimal.MinValue}");
执行结果为:

float 的最大值:3.40282347E+38
float 的最小值:-3.40282347E+38
double 的最大值:1.7976931348623157E+308
double 的最小值:-1.7976931348623157E+308
decimal 的最大值:79228162514264337593543950335
decimal 的最小值:-79228162514264337593543950335

C#浮点数的后缀字符

如果一个含小数点的数值没有后缀字符,或是说没有 D 或 d 后缀字符,则表示此数值是一个双精度浮点数。

【实例】设定 pi 是 3.14159。
double pi = 3.14159;  // 没有后缀字符,所以3.14159是双精度浮点数
如果一个含小数点的数值,其后缀字符是 F 或 f,则此数是单精度浮点数。以下会有错误产生,因为 3.14159 是双倍精度浮点数,单精度浮点数变量 pi 空间不足。
float pi = 3.14159;  // 错误 !
我们可以将其改写为如下两种形式:
float pi = 3.14159F; // 正确
float pi = 3.14159f; // 正确
如果一个含小数点的数值,其后缀字符是 M 或 m,则此数值是 decimal 浮点数,如前所述 decimal 数的特色是会保留小数点右边的 0。

【实例】认识 float、double 和 decimal 数字。
float pi1 = 3.14159265359000f;
double pi2 = 3.14159265359000;
decimal pi3 = 3.14159265359000m;
Console.WriteLine($"float pi1 = {pi1}");
Console.WriteLine($"double pi2 = {pi2}");
Console.WriteLine($"decimal pi3 = {pi3}");
执行结果为:

float pi1 = 3.1415927
double pi2 = 3.14159265359
decimal pi3 = 3.14159265359000

从上述执行结果,读者可以看到单精度浮点数 pi1 输出了 7 位的有效位数。双精度浮点数可以保留 15 位的有效位数,所以可以输出所有位数。高精度十进制浮点数可以保留 29 位有效位数,所以 pi3 保留了右边的 3 个 0。

C#浮点型科学记数法

若有一数字是 123.456,则我们可以将它表示为:
1.23456E2
0.123456e3
123456E-3

在上例的科学记数法中,大写 E 和小写 e 意义是一样的。


【实例】科学记数法的应用。
double d = 0.535e2;
Console.WriteLine(d);

float f = 123.45E-2f;
Console.WriteLine(f);

decimal m = 1.2300000E6m;
Console.WriteLine(m);

double ff = 123456E-3;
Console.WriteLine(ff);
执行结果为:

53.5
1.2345
1230000.0
123.456

C#千位分隔符

对于比较长的数字,不易于理解,这时可以使用“_”作为千位分隔符,适度地使用千位分隔符可以让所表达的数字比较易于理解。

【实例】将千位分隔符应用在浮点数中。
float f = 50_666.8f;
Console.WriteLine(f);
double d = 3.1_415_926;
Console.WriteLine(d);
decimal money = 123_456.50m;
Console.WriteLine(money);
执行结果为:

50666.8
3.1415926
123456.50

C# sizeof()

借助 sizeof() 函数可以用于取得浮点数的长度,其所回传的单位是字节(byte)。

注意,sizeof() 函数的参数不可以使用变量名称,必须是数据类型。

【实例】列出浮点数数据类型所需的内存大小。
Console.WriteLine($"float长度 = {sizeof(float)}");
Console.WriteLine($"double长度 = {sizeof(double)}");
Console.WriteLine($"decimal长度 = {sizeof(decimal)}");
执行结果为:

float长度 = 4
double长度 = 8
decimal长度 = 16

认识float和double的NaN和无限大

双倍精度浮点数或是单精度浮点数的运算也可以产生下列 3 种数值:
Double.NaN:非数值            // 也可应用在 float
Double.PositiveInfinity:正无限大 ∞ // 也可应用在 float
Double.NegativeInfinity:负无限大 - ∞    // 也可应用在 float

【实例】输出非数值、正无限大 ∞ 和负无限大 -∞。
double x = 0.0 / 0.0;
Console.WriteLine(x);
Console.WriteLine(Double.NaN);
double inf = 5.0 / 0.0;
Console.WriteLine(inf);
Console.WriteLine(double.PositiveInfinity);
double ninf = -5.0 / 0.0;
Console.WriteLine(ninf);
Console.WriteLine(double.NegativeInfinity);
执行结果为:

NaN
NaN


-∞
-∞

相关文章