float类型 占据空间32位4字节

double类型 占据空间64位8字节

特别注意的是指数位存放的是补码,底数是2!

具体举例:

1.十进制转二进制

整数部分

十进制整数转二进制数:“除以2取余,逆序排列”(短除反取余法)

例: 89(10) =10110012(2)
除数 被除数 余数
2 89
2 44 1
2 22 0
2 11 0
2 5 1
2 2 1
2 1 0
2 0 1

小数部分

十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)

例: 0.625(10)= 0.101(2)
乘数 * 乘数 = 整数
0.625 X 2 = 1.25 1
0.25 X 2 = 0.5 0
0.5 X 2 = 1.0 1

转换结果

由上两步可知,89.625(10)转换为二进制位1011001.101(2)

在计算机中的储存方式

  • float f = 89.625f;
    • 计算符号位:因为为正数,所以符号位为 0。
    • 计算指数位:规范化表示小数点左边只能有一位并且为1,所以为1.011001101 x 26,规定指数位的底为2且幂加127(double类型加1023),所以指数位为133(127+6),转换为二进制——>1000 0101(2)
    • 计算尾数位:规定尾数位去掉规范化前边的整数位的1,只保存小数,所以尾数位为 ——> 011001101
      最终得到的完整的浮点数为: 0 10000101 01100110100000000000000

符号位 指数位 尾数位
0 10000101 01100110100000000000000

2.二进制转十进制

(2) =(1×2 3+0×2 2+1×2 1+1×2 0+0×2 -1+1 × 2 -2) (10) = (8+0+2+1+0+0.25) (10) = 11.25 (10)

规律:个位上的数字的次数是0,十位上的数字的次数是1,…,依奖递增,而十分位的数字的次数是-1,百分位上数字的次数是-2,…,依次递减。

注意:不是任何一个十进制小数都能转换成有限位的二进制数。

数据类型强转

double in = 1.0256789123;	// in = 1.0256789123
float f = (float)in;		// f = 1.0256789; double 强转为float会造成精度丢失
int i = (int) f;			// i = 1;强转为 int类型 会丢失全部的小数位

强转注意:

值得引起注意的是: 浮点数强转,并不像整形强转那样,直接将数据一刀切

(10) 对应的2进制为 0000 0001 0111 1111
强转为byte类型
值为127 (10) 对应的二进制位 0111 1111
直接丢失高位字节

获取浮点数的整数位与小数位

获取浮点数的整数位

public int zhengshuwei(double in){
	return (int)in;
}

获取浮点数的小数位

public double xiaoshu(double in){
	int flag = (int)in;
	return in - flag;
}

若要将一个浮点数按其二进制强转为整形需调用其引用类型

long res = Double.doubleToLongBits(s);

根据其二进制获取数据的小数部分

	/**
	* @param s Double.doubleToLongBits(s);转过来的值
	* 即double数据对应的二进制的值
	*/
	public static double xiaoshu(long s) {
		int len = (int) ((s >>> 52 & 0x7ff )- 1023);//float - 127  >>> 23
		len = 52 - len;
		double res=0;
		for(int i=0-len;i<0;i++) {
			res += (s & 1) * Math.pow(2, i);
			s >>>= 1;
		}
		return res;
	}

根据其二进制获取数据的整数部分

	public static int zhengshu(long s) {
		int len = (int) ((s >>> 52 & 0x7fff )- 1023);//float - 127  >>> 23
		return (int) (((s & 0xfffffffffffffl) >> (52 - len)) + (1 << len));
	}