------------siwuxie095
在Java数值运算中,经常会出现不同的类型的数据相互转换的现象。
b1+10 赋值给 b2,Java默认整数运算是 int 类型运算,即结果是 int 类型
因此 b1+10 的结果会自动转换为 int 类型,当 int 类型数据向小类型:byte
中存储时需要进行类型转换,否则会报错
如:
package com.siwuxie095.test;
public class Test09 {
public static void main(String[] args) { int i=-2; long l=i;//小类型转大类型,符号位自动扩展 //调用包装类的方法,打印二进制的值 System.out.println(i+":"+Integer.toBinaryString(i)); System.out.println(l+":"+Long.toBinaryString(l)); }
} |
Eclipse中:
运行一览:
小类型向大类型转换一般情况下是安全的。
当小类型的精度高于大类型时要注意精度丢失的隐患。
(1)int类型转换为float类型:
int类型(32位)的精度是31位,其32位中最高位是符号位,剩下31位是尾数,
用来存数据,而float类型(32位)的尾数只有23位,即精度只有23位
当int类型转换为float类型时虽然不会丢失数据,但有可能丢失精度
如:
package com.siwuxie095.test;
public class Test10 {
public static void main(String[] args) { //给 i 赋值7位十六进制的值,即 28位二进制值 //超出float尾数23位的范围,尾数不够,精度丢失 int i=0x1000001; float f=i; //调用包装类方法,打印二进制和十进制的值 System.out.println(Integer.toBinaryString(i)+":"+i); //Float包装类没有toBinaryString()方法 //因此依然用Integer中的方法,不过要注意类型转换 System.out.println(Integer.toBinaryString((int)f)+":"+f); }
} |
Eclipse中:
运行一览:
显然:float丢失了二进制最后一位的值:1,同时十进制也丢失了最后一位
(注意:float的十进制值使用了科学计数法)
(2)long类型转换为double类型:
long类型(64位)的精度是63位,其64位中最高位是符号位,剩下63位是尾数,
用来存数据,而double类型(64位)的尾数只有52位,即精度只有52位
当long类型转换为double类型时虽然不会丢失数据,但有可能丢失精度
如:
package com.siwuxie095.test;
public class Test11 {
public static void main(String[] args) { //给 l 赋值14位十六进制的值,即 56位二进制值 //超出double尾数52位的范围,尾数不够,精度丢失 long l=0x20000000000001L; double d=l; //调用包装类方法,打印二进制和十进制的值 System.out.println(Long.toBinaryString(l)+":"+l); //Double包装类没有toBinaryString()方法 //因此依然用Long中的方法,不过要注意类型转换 System.out.println(Long.toBinaryString((long)d)+":"+d); }
} |
Eclipse中:
运行一览:
同样:double丢失了二进制最后一位的值:1,同时十进制也丢失了最后一位
(注意:double的十进制值使用了科学计数法)
【made by siwuxie095】