上一节课,我们讲了整型数的表示方法:补码,今天我们讲讲浮点数的表示方法
浮点数在平时的开发中也经常用到,比如用来表示金额等,浮点数并不能精确地表示整数或小数,所以,在使用时,要多加小心,稍有不慎就会引入 bug
因此,了解浮点数的表示方法等相关理论知识,就相当有必要了
一、实数的二进制科学记数法
1.1、十进制的科学记数法
浮点数是计算机中用来表示实数的数据类型,实数是一个数学概念,这里我们可以简单理解为小数,不过,整数也可以看做实数,比如 5 可以看做 5.0,也算是实数
我们知道,整数在计算机中有固定的表示方法(或者叫存储格式):补码
同样,浮点数也有固定的表示方法,并且形成了一份规范文件,叫做 IEEE754 标准,绝大多数计算机都参照这个标准来存储浮点数
浮点数在计算机中的存储格式类似科学记数法,所以,我们先来了解一下什么是科学记数法
在数学计算中,特别是在表示一些物理量时,比如星球之间的距离,为了方便表示很大很大的数,我们一般采用科学记数法
我们将数据表示成 x *10 ^ y 的形式,x 叫做尾数或有效数字,y 叫做指数、幂或者阶数
例如,我们可以将 12350000 表示为 1.235 * 10 ^ 7,为了方便书写,我们一般会将科学记数法的表示形式,简化为 xEy 的形式
例如,我们把 1.235 * 10 ^ 7 简写为 1.235E7,在编程中,我们也可以使用这种简化的书写方式
float f1 = 100000000.0F;
System.out.println("" + f1); // 输出 1.0E8
float f2 = 1.3E23F;
System.out.println("" + f2); // 输出 1.3E23
1.2、二进制的科学记数法
上面讲的是十进制的科学记数法,接下来,我们再看一下二进制的科学记数法
对于一个实数,我们可以将其分为两部分:整数部分和小数部分
我们将整数部分和小数部分分别转换为二进制数,然后中间用点号(.)连接,就得到了实数对应的二进制表示
例如,十进制数 12.375 转换成二进制表示为:1100.011,十进制数 -12.375 转换成二进制表示为:-1100.011
对于整数如何转化成二进制表示,我们在上一节课中已经讲过了,采用是除 2 求余的方法,接下来,我们重点讲一下,如何将小数部分转换成二进制表示
对于小数的十进制表示,点号以后的每一位都对应一个权值,依次为 1 / 10,1 / 10 ^ 2,1 / 10 ^ 3 ... 以此类推
同理,对于小数的二进制表示,点号以后的每一位对应权值依次为 1 / 2,1 / 2 ^ 2,1 / 2 ^ 3 ... 以此类推
类比十进制的乘 10 运算,假设某个小数 w 表示成二进制数之后为:0.xyz(x、y、z 为 0 或 1),将其乘 2 就相当于点号后移一位,变为:x.yz,这时对其取整,就得到了 x,这样我们就分离出了第一位小数
以此类推,每次乘以 2,然后取整,就能依次得到小数点后的每一位
这种将小数转换为二进制表示的方法叫做乘 2 取整法,下图是对于上述处理过程的举例解释