int转float必然会导致精度丢失,int型是32位,float型也是32位,但是float是由1位符号位+8位指数位+23位小数位组成。
所以float只能有效表示24位以内的int型数据(float有一位省略的整数位)当int型是24位以上的时候,多余的位就会被舍去。
上面的内容是从网上看到的,事实也是如此,但是自己测试的时候发现int型的多余位数并不是被简单的直接抹去,有的时候转成float型会变大,有时候会变小,通过百度发现float的舍入规则这个东西。
在IEEE754标准中,舍入处理提供了四种可选方法:
就近舍入其实质就是通常所说的"四舍五入"。例如,尾数超出规定的23位的多余位数字是10010,多余位的值超过规定的最低有效位值的一半,故最低有效位应增1。若多余的5位 是01111,则简单的截尾即可。对多余的5位10000这种特殊情况:若最低有效位现为0,则截 尾;若最低有效位现为1,则向上进一位使其变为 0。(java中采用就近舍入)
朝0舍入 即朝数轴原点方向舍入,就是简单的截尾。无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。这种方法容易导致误差积累。
朝+∞舍入 对正数来说,只要多余位不全为0则向最低有效位进1;对负数来说则是简单的截尾。
朝-∞舍入 处理方法正好与 朝+∞舍入情况相反。对正数来说,只要多余位不全为0则简单截尾;对负数来说,向最低有效位进1。
在java中使用的是就近舍入这种方式,比如1 1111 1111 1111 1111 1111 0011这个int数有25位,在转float的时候前24位有效,末尾是1,相当于是多余尾数是10000,就看最低有效尾数是1,就向上进一位。变成1 1111 1111 1111 1111 1111 010。
如果是1 1111 1111 1111 1111 1111 00101这样,多余尾数相当于是10000,最低有效尾数是0,就直接舍去多余尾数变成1 1111 1111 1111 1111 1111 0010。