程序设计时,如果需要比较精确地记录数值的变化,即需使用小数点以下数值时,则建议使用浮点数来声明此变量,如平均成绩、温度、里程数等。在其他高级语言中,人们习惯称此数为实数,浮点数有两种,float是单精度浮点数、double是双精度浮点数,另外C#又多了一般程序语言没有的decimal(高精度十进制)类型的浮点数。
由于double(双精确度浮点数)和float(单精度浮点数)之间,除了容量不一样之外,其他均相同,所以在此节我们将其合并讨论,表3-3展示了浮点数数据类型的概念。
表3-3 C#浮点数数据类型表
表3-3中长度的单位是位(Bit),8位等于1个字节。
上述数据类型中decimal的精确度最高,其特色是由小数点右边的数字数目决定数值的精确度,此类型的数据常被用在财务程序、货币金额(如$350.00)或利率(如2.5%)上。此外,decimal数的另一个特色是会保留小数点右边的0,读者可以参考3-5-3节的项目ch3_7。以下是单精度浮点数与双精度浮点数的说明。
另外,若是有一个数字为0.789,我们可以省略0,而直接将它改写成.789。
表3-3中的每个浮点数数据类型皆有MinValue和MaxValue属性,此属性可以显示该浮点数数据类型的最小值和最大值。
方案ch3_6_1.sln: 列出浮点数float、double和decimal的最小值和最大值。
如果一个含小数点的数值没有后缀字符,或是说没有D或d后缀字符,则表示此数值是一个双精度浮点数。
实例1.设定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。
方案ch3_7.sln: 认识float、double和decimal数字。
从上述执行结果,读者可以看到单精度浮点数pi1输出了7位的有效位数。双精度浮点数可以保留15位的有效位数,所以可以输出所有位数。高精度十进制浮点数可以保留29位有效位数,所以pi3保留了右边的3个0。
实例1.若有一数字是123.456,则我们可以将它表示为:
1.23456E2
或
0.123456e3
或
123456E-3
在上例的科学记数法中,大写E和小写e意义是一样的。
方案ch3_8.sln: 科学记数法的应用。
3-4-4节整数千位分隔符的概念也可以应用在浮点数中:比较长的数字,不易于理解,这时可以使用“_”作为千位分隔符,适度地使用千位分隔符可以让所表达的数字比较易于理解。
方案ch3_9.sln: 将千位分隔符应用在浮点数中。
3-4-6节所介绍的sizeof()函数也可以用于取得浮点数的长度,其所回传的单位是字节(byte)。注:sizeof()函数的参数不可以使用变量名称,必须是数据类型。
方案ch3_10.sln: 列出表3-3中浮点数数据类型所需的内存大小。
双倍精度浮点数或是单精度浮点数的运算也可以产生下列3种数值:
方案3_11.sln: 输出非数值、正无限大∞和负无限大-∞。