C语言的浮点类型有两种不同的表示形式:十进制数和科学计数法。十进制数形式,由数字和小数点组成,且必须有小数点,如0.123、12.85、26.98等;科学计数法形式,如:2.1E5、3.7e-2等。其中e或E之前必须有数字,且e或E后面的指数必须为整数。
科学计数法
一种简化计数的方法,对于位数较小的数值,科学计数法没有什么优势,但对于位数较多的数值其计数方法的优势就非常明显了。例如:光的速度是300,000,000米/秒,全世界人口数大约是6,100,000,000。类似光的速度和世界人口数这样大数值的数,读、写都很不方便,仔细观察上面的两个数值,光的速度可以写成3*108米/秒,全世界人口数可以写成6.1*109。这种计数方法就是科学计数法,用Java语言科学计数法表示光速是3E8,世界人口数大约是6.1E9。
一个较大的数值(>0)可以用下面的方式来表示:
a * 10n (1<=a<10,n为整数)
其中,a是该数值的有效位数,有效位数从左边第一个不是0的数起,到末尾数字为止,所有的数字(包括0,科学计数法不计10的n次方),称为有效数字。例如:光速是3E8,其有效数字是1位,值是3;世界人口数大约是6.1E9,其有效数字是2位,值是6.1。
n是该数值的整数部分减1的正整数。
一个较小的数值(<0)可以用下面的方式来表示:
a * 10-n (1<=a<10,n为整数)
a的取值同上面相同,n的取值为原数中左边第一个不为0的数字前面所有的0的个数(包括小数点前面的0)。
浮点类型
在C语言中,浮点类型有float和double两种,分别表示单精度浮点数和双精度浮点数。精度是指描述一个数值的准确程度,在数学运算中,经常会用到近似数,近似数与原数值非常相近,但又不完全符合原数值,只能说在某种程度上近似。精度与近似数相似,也是用一个与原数值非常相近的数代替原来的数值。
前面说过存储一个数值所用的字节越多,其精度越高,数值范围也越大。由此看来,精度与存储字节数密切相关,float类型的存储空间是4个字节,其表示的值范围约为10-38到1038,double类型的存储空间是8个字节,其表示的值范围约为10-308到10308,float存储数值的精度和范围要小于double存储数值的精度和范围。因此,float是单精度数值,double是双精度数值。

图 浮点型变量占用的存储空间
浮点变量
float变量可按如下方式声明:
float price = 12.35f;
float average = 89.2f;
double变量可按如下方式声明:
double pi = 3.14159265;
public double average = 89.2987017;
数值赋值给float变量时,数值尾部要加上小写“f”或大写“F”声明为float数值,不然编译器会给出从“double”到“float”截断的警告。因为在C语言中,带小数的数值默认为是double类型,double类型转换为float类型,自然要损失精度,位数被截断了。
C语言还提供了long double类型,表示长双精度浮点数,但C语言并没有long double的确切精度,对于不同系统平台可能有不同的实现,有的是8字节,有的是10字节,有的是12字节或16字节,C语言函数sizeof(long double)可以输出当前系统平台下long double占用的字节数。
浮点数值常量的后缀有:f或F(单精度浮点数)、l或L(长双精度浮点数),因为浮点型常数总是有符号的,所以没有u或U后缀。例:1.23e5f; 1.23L; -123.45f;