C#中的浮点类型(非常详细)
C# 程序设计时,如果需要比较精确地记录数值的变化,即需使用小数点以下数值时,则建议使用浮点数来声明此变量,如平均成绩、温度、里程数等。
在其他高级语言中,人们习惯称浮点数为实数,浮点数有两种,float 是单精度浮点数、double 是双精度浮点数,另外 C# 又多了一般程序语言没有的 decimal(高精度十进制)类型的浮点数。
表中长度的单位是位(Bit),8 位等于 1 个字节。
上述数据类型中 decimal 的精确度最高,其特色是由小数点右边的数字数目决定数值的精确度,此类型的数据常被用在财务程序、货币金额(如 $350.00)或利率(如 2.5%)上。此外,decimal 数的另一个特色是会保留小数点右边的 0。
下图是单精度浮点数与双精度浮点数的说明:
【实例】列出浮点数 float、double 和 decimal 的最小值和最大值。
【实例】设定 pi 是 3.14159。
【实例】认识 float、double 和 decimal 数字。
【实例】科学记数法的应用。
【实例】将千位分隔符应用在浮点数中。
注意,sizeof() 函数的参数不可以使用变量名称,必须是数据类型。
【实例】列出浮点数数据类型所需的内存大小。
【实例】输出非数值、正无限大 ∞ 和负无限大 -∞。
在其他高级语言中,人们习惯称浮点数为实数,浮点数有两种,float 是单精度浮点数、double 是双精度浮点数,另外 C# 又多了一般程序语言没有的 decimal(高精度十进制)类型的浮点数。
C#浮点数基本概念
由于 double(双精确度浮点数)和 float(单精度浮点数)之间,除了容量不一样之外,其他均相同,所以在此节我们将其合并讨论,下表展示了浮点数数据类型的概念。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
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
∞
∞
-∞
-∞