转载来源:http://blog.csdn.net/goskalrie/article/details/50698004
Java中数值类型之间的转换方式有两种:一是自动转换,另一种是强制类型转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。
1、自动数据类型转换:
下表中给出了数值类型之间的合法转换
。
在上图中有6个细线建投,表示无信息丢失的转换;有三个粗线箭头,表示可能有精度损失的转换。例如,123456789是一个大整数,它所包含的位数比float类型所能够表达的位数多。当将这个整型数值转换为float类型时,将会得到同样大小的结果,但却失去了一定的精度。
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低--------------------------------------------->高
byte,short,char-> int -> long -> float -> double
int n = 123456789;
float f = n;//f值为1.234567892E8
当使用上面两个数值进行二元操作时(例如 n+f , n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算。
如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型;
否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型;
否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
否则,两个操作数都将被转换为int类型。
2.强制类型转换
强制转换的格式是在需要转型的数据前加上“( )”,然后在括号内加入需要转化的数据类型。有的数据经过转型运算后,精度会丢失,而有的会更加精确。例如:
double dx = 9.99;
int ix = (int)dx;
这样,变量ix的值为9。强制类型转换通过截断小数部分将浮点值转换为整型。
如果想对浮点值进行舍入运算,以便得到最接近的整数(在很多情况下,希望使用这种操作方式),那就需要用Math.round方法:
double dx = 9.99;
int ix = (int)Math.round(10);
现在,变量ix的值为10.当调用round方法的时候,仍然需要使用强制类型转换。其原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换成int类型。
警告:如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如:
不要在boolean类型与任何类型之间进行强制类型转换,这样可以防止发生错误。