在表达式的计算过程中,经常会出现将数值从一种数字类型转换为另一种数字类型,如下图:
上图中,有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