浮点型是带有小数部分的数据类型。浮点型包含单精度浮点型(float)和双精度浮点型(double)。
单精度和双精度的差别在于所占用的内存大小不同。
float 类型要占用 4 个字节的内存空间,每个字节 8 位,总共 32 位;double 类型占用 8 个字节的内存空间,共 64 位。double 比 float 具有更高的精度和更大的表示范围。浮点数在内存的存储方式如下图:

符号域 | 指数域 | 尾数域 | 指数偏移量 | |
单精度浮点数 | 1位[31] | 8位[30-23] | 22位[22-00] | 127 |
双精度浮点数 | 1位[63] | 11位[62-52] | 52位[51-00] | 1023 |
为什么会有偏移量是因为指数域有正数和负数,所以通过偏移量来存储指数域数据。举个例子,假设 -4.25 如何转化为内存的存储方式?
- 将4.25转化为二进制 -4.25=-100.01,简单做个补充:浮点型转化二进制分为两部分,整数及小数。4 二进制为0100,0.25 * 2 取整数部分,直到为 1 结束,结果为 01,-4.25 将两部分合并起来就得到 -100.01。
- 将二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。该方法为科学计数法。100.01=-1.00101*2^2
- 从小数点右边第一位开始数出二十三位数字放入第22到第0位,不足23位补 0。
- 浮点数为正,则在第31位放入 0,否则放入 1。
- 由于小数点向右移了两位,所以单精度的偏移量是 2+127,如果是双精度则 2+1023,然后将得到的结果转化为二进制从左往右依次填入指数域。单精度类型的 -4.25 最后的存储方式如下图:
扩展知识:假设定义一个变量 float f=-4.25;这样定义正确?一定要记住,这是不正确的。-4.25 是双精度类型,将双精度类型向下转换成单精度类型会造成精度丢失,所以要把-4.25强制转换为单精度类型,即 float f = (float)-4.25;或者可以 float f=-4.25f。f不区分大小写。
最后,祝大家学习愉快!