当我们把一种基本的数据类型变量的值赋给另一种基本类型变量时,就涉及数据转换
下列基本类型会涉及数据转换,不包括逻辑类型和字符类型
将这些类型按精度从低到高排列的顺序为:
byte short int long float double
当把级别低的变量的值赋给级别高的变量时,系统会自动完成数据类型的转换
所以,b=a+b的时候,就会把结果自动转换为float
class TurnTo
{
public static void main(String[] args)
{
int a = 1;
float b =2;
b = a+b;
System.out.print(b);
}
}
在这个程序里,int类型的精度没有float高,当a+b时,就是一个int类型的,和一个float类型的值做运算,根据自动转换的原则,它们的和会自动提升,就是为float类型的,在赋值给一个float类型的容器,当然是没有问题的,所以自然会打印出float类型的3.0就不奇怪了。
再看我们对这个小程序做一些改动:
class TurnTo
{
public static void main(String[] args)
{
int a = 1;
float b =2;
a = a+b;
System.out.print(b);
}
}
我把赋值的b容器,改成了a,由于a是int类型的,上面我已经说了,a和b的和,是一个float类型的,这样就会损失精度。
所以,这个程序编译不过。报错就是,损失精度:
再看这个:
class TurnTo
{
public static void main(String[] args)
{
double a = 1;
float b =2;
b = a+b;
System.out.print(b);
}
}
我把a定义为double类型的了,这时,a和b在运算时,就会自动转换为double类型的了,double想要赋值给float类型,自然也会损失精度
所以,同样编译不过。
不知道,通过这三个小程序,有没有更理解一些。
Java数据类型的转换原则
基本数据类型的隐式转换与显示转换,不是根据所占字节的大小来转型的,而是根据精度来转型的.
精度从小到大的顺序为:
byte -> short -> int = char(char参与计算时,会先将字符对应的unicode码转换成int型再参与数学运算.) -> long -> float -> double