类型转换(cast)的愿意是“模型铸造”,在适当的时候,java会将一种数据类型自动转换成另一种。比如我们为某浮点变量赋以一个整数值,编译器会将int自动转换成float。在java中,我们可以显示进行类型转换或者强制类型转换。如:
int i = 200;
long lng = (long)i;
这里我们可能是多余的,即使我们不通过(long)来对i进行转换,编译器也会自动进行int值到long值的提升,这就是扩展转换。下面的写法也是正确的:
int i = 200;
long lng = i;
但是有个情况,我们必须注意到,如:
double d = 0.7;
int i = (int)d;
当类型由大转小的时候,必须进行类型转换,否则编译会报错。这里的i获取的值是0,并没有进行四舍五入,而是直接对值进行了截尾操作。这不是窄化转换。在进行窄化转换操作时,要注意截尾和舍入的问题。
如果要想进行四舍五入操作,将采用java.lang.Math中的round()方法。
例子代码如下:
public class CasstingNumbers{
public static void main(String[] args){
double above = 0.7, below = 0.4;
float fabove = 0.7f, fbelow = 0.4f;
int i = (int)above;
System.out.println("i: " + i); //0
int j = 1;
long lng = j;
System.out.println("lng:" + lng); //1
System.out.println("(int)above: " + (int)above); //0
System.out.println("(int)below: " + (int)below); //0
System.out.println("(int)fabove: " + (int)fabove); //0
System.out.println("(int)fbelow: " + (int)fbelow); //0
System.out.println("Math.round(above): " + Math.round(above)); //1
System.out.println("Math.roundbelow: " + Math.round(below)); //0
System.out.println("Math.roundfabove: " + Math.round(fabove)); //1
System.out.println("Math.roundfbelow: " + Math.round(fbelow)); //0
}
}
output:
i: 0
lng:1
(int)above: 0
(int)below: 0
(int)fabove: 0
(int)fbelow: 0
Math.round(above): 1
Math.roundbelow: 0
Math.roundfabove: 1
Math.roundfbelow: 0