int n = 123456789;
float f =n;
打印f,发现f=1.23456792E8,发生了精度损失。
我起初的疑问,float取值范围比int取值范围大,为什么会出现精度损失那?
这里主要还是int和float底层的存储结构不同导致的。
int使用31位表示精度,float底层有23位来表示尾数,8位表示阶数。
这里精度主要是由这23位尾数来决定的(当指数位全部为0时省略的是0否则省略的是1;尾数23位加上省略的1位,float的精确度有24位。),8位阶数主要用来控制浮点数的大小。
如果int的范围超过了2^24,那么转换成float就会损失精度。
我们运用IEEE754标准来将123456789转换成单精度浮点数,来看一下精度是如何丢失的。
123456789 = 0x111010110111100110100010101 = 1.11010110111100110100010101 X 2^26
指数E=26+127=0x01111001
最终结果:0 10011001 11010110111100110100011 即123456792
精度损失,丢了3位。注意(这里最后3位101被丢掉了,但是进行了舍入处理,所以最终结果中的最后一位从0变成了1)