第15节 小类型向大类型转换案例
概述
我们知道int类型的精度是31位,因为int类型32位中最高位是符号位,剩下的31位是用来存数据的,因此它的尾数是31,float类型也是32位,但是尾数是23位,要比int类型的尾数少,精度要差,所以int类型像float类型转换时,虽然不会出现数据丢失的问题,但有可能出现精度丢失的问题。
1、现在我们定义一个int类型的变量i,给他一个16进制的值,0X后面给一个七位的16进制的数,我们知道七位数转换成二进制就是4*7=28位,这样就超出了float类型尾数23位的范围,就有可能出现尾数不够,精度丢失的问题,输入1234567,现在已经有七位数字,
2、将i赋值给float变量f,28位二进制数据存到float类型中,就会出现精度丢失的问题,
3、输出一下i的值,将其转换转换为二进制,后面输出一下i的十进制值作对比,
4、在输出float类型变量f,注意float包装类中没有toBinaryString的方法,因此我们还是要引用integer类的方法,所以要先把f转换成int类型,后面输出f的十进制值,
5、运行程序:
前面第一行是变量i的二进制值,第二行是float类型变量f的值,我们可以看到float类型丢失了最后一位的值1没有了,
再对比后面十进制这个值,第一行是int类型的变量,第二行是float类型的值,1.6777216乘以10的7次方,这是科学计数法,我们看到float最后一位六,也比i的七少了一个数,这就是float类型变量在存储i变量的数据时丢失了最后一位,原理就是因为float的尾数是23位,而我们给的数是28位,已经超过了23位的范围。
注意:长整形是八个字节64位,高位是符号位,剩下36位是尾数,即存储数据的精度是63位,double类型也是八个字节64位,但是存取数据的尾数即精度部分只有52位。
我们现在设计一个案例,让一个long类型的数据超过double类型的52位,就会出现long类型数据转换为double时出现精度丢失的现象。
演示:
创建测试类Test15,
1、定义long类型变量L,给它赋值54位二进制,54位就是56÷4=14个数,输入1~14,这是一个有14位的十六进制数,按每一位是四位展开就是对应的二进制值,最后加上一个l,
2、定义double类型变量d=l,
3、输出,调用Long包装类里的toBinaryString输出l的值,后面输出他的十进制值,
4、输出double的二进制值,double包装类中没有toBinaryString,所以我们还得使用Long包装类中的toBinaryString,注意将d转换为long类型,后面再输出它的十进制值,
5、运行程序,
long整型和double类型二进制做一下对比,又出现了丢失问题,double因为只有52位,所以无法盛下long类型,l类型最后有个1,所以double类型丢失了最后一位的数据。
再看十进制值,同样long最后是93,double最后时92×10的65次方,也丢失了一位。
总结:通过这两个案例我们认识到当小类型向大类型的数据转换时,一定要注意如果小类型精度值高于大类型的精度值,要注意在转换时避免精度丢失的问题。