在表达式的计算过程中,经常会出现将数值从一种数字类型转换为另一种数字类型,如下图:

上图中,有6个实心箭头,表示无信息丢失的转换。有3个虚线箭头,表示可能有精度损失的转换。例如:
public class Demo {
public static void main(String[] args) {
int a = 123456789;
float b = a;
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}运行示例,输出结果如下:
a=123456789 b=1.23456792E8
当将 int 类型转换为 float 类型时,将会得到同样大小的结果,但却失去了一定的精度。
当将两个数值(一个整数、一个浮点数)进行操作时,需要先将两个操作数转换为同一种类型,然后再进行计算。转换规则如下:
如果两个操作数中有一个是 double 类型,另一个操作数需要转换为 double 类型
如果两个操作数中有一个是 float 类型,另一个操作数需要转换为 float 类型
如果两个操作数中有一个是 long 类型,另一个操作数需要转换为 long 类型
最后,两个操作数都将转换为 int 类型
示例:
public class Demo {
public static void main(String[] args) {
int a = 1;
long b = 2L;
float c = 1.0f;
double d = 2.0D;
short e = 1;
byte f = 1;
// 如果两个操作数中有一个是 double 类型,另一个操作数需要转换为 double 类型
double r1 = a + d;
System.out.println("r1=" + r1);
// 如果两个操作数中有一个是 float 类型,另一个操作数需要转换为 float 类型
float r2 = a + c;
System.out.println("r2=" + r2);
// 如果两个操作数中有一个是 long 类型,另一个操作数需要转换为 long 类型
long r3 = a + b;
System.out.println("r3=" + r3);
// 最后,两个操作数都将转换为 int 类型
int r4 = a + e + f;
System.out.println("r4=" + r4);
}
}运行示例,输出结果如下:
r1=3.0 r2=2.0 r3=3 r4=3
前面介绍了表达式中数据类型的自动转换。但是,在必要的时候,我们需要进行类型强制转换,即使丢失精度。
从低级数值类型到高级数值类型之间的转换称为提升转换。例如:byte 转换 short、short 转换 int、int 转换 long、float 转换 double 等。
从高级数值类型到低级数值类型之间的转换称为降格转换。例如:long 转换 int、short、byte,doubel 转换 float 等。
强制数值类型转换格式为:
(目标数据类型)<表达式>
示例:
public class Demo {
public static void main(String[] args) {
int a = (int)3.14f;
System.out.println("a=" + a);
int b = (int)1890L;
System.out.println("b=" + b);
float c = (float)a + b;
System.out.println("c=" + c);
byte d = (byte)a;
System.out.println("d=" + d);
}
}运行示例,输出结果如下:
a=3 b=1890 c=1893.0 d=3