目录
int类型和float类型在java中都是占四个字节,也就是32位,如何去比较float和int类型的精度,首先要分析两者的组成
int类型的存储方式和取值范围:
int数据类型在内存中占用了4个字节byte(4*8个bit比特)就是32个比特位。
第一位代表int的正负,后31位存储数据。
当int取最大值时相当于31个1(1*2^30+1*2^29+1*2^28+....+1*2^0)可以转化为有32位切为1其他为0之后再减去1(1*2^31-1)。换算一下大概是21亿多。
浮点数的存储方式:
1位符号位, 8位指数移码 ,23位尾数
以小数0.65625为例,分析浮点数存储方式:
1、将十进制小数转化为二进制0.10101(整数部分除二取余,小数部分乘二取整)
2、用科学计数法表示:1.0101 * 2^{-1} (IEEE 754标准规定小数点前留1(为的是一个数的唯一表示,且防止全是0浪费位数)
3、符号位为0直接填,指数位为2^{x-127},所以x=126,二进制为01111110,因为表示的二进制数整数位都是1,所以整数位直接省略,存0101,补全后得到32位浮点数:
0 01111110 00000000000000000000101
float类型的取值范围:
尾数为 0.1111111 11111111 11111111,指数为 11111111,但是指数全为1时有其特殊用途,所以指数最大为 11111110,指数减去127得到127,所以最大的数字就是1.1111111 1111111 11111111 x 2^{ 127},这个值为 340282346638528859811704183484516925440,通常表示成 3.4028235E38,那么float的范围就出来了:[-3.4028235E38, 3.4028235E38] 。
float类型和int类型的精度比较:
知道了浮点数的存储方式之后,我们就不难发现浮点数存储各数之间的间距并不稳定,离0越远精度越低。而int类型各数之间的间距都为1,所以在数据较小的时候float精度高,而数据较大的话则是int类型精度较高。