正常转换
在程序运行时,经常需要将一种数值类型转换为另一种数值类型。附件中的图给出了数值类型之间的合法转换。
在图中有6个实箭头,表示无数据丢失的转换;有3个虚箭头,表示可能有精度损失的转换。例如,123 456 789是一个大整数,他所包含的位数比float类型所能够表达的位数多。当将这个整数数值转换为float类型时,将会得到同样大小的结果,但却失去了一定的精度。
int n = 123456789;
float f = n; //f is 1.23456792E8
当使用两个不同类型的数值进行二元操作时,需要先将两个操作数转换为同一种类型,然后再进行计算。
- 如果两个操作数种有一个是double类型的,那么另一个操作数将会转换为double类型。
- 否则,如果其中一个操作数是float类型,那么另一个操作数将会转换为float类型。
- 否则,如果其中一个操作数是long类型,那么另一个操作数将会转换为long类型。
- 否则,两个操作数都将被转换为int类型。
强制类型转换
在上面一部分,我们看到,在必要地时候,int类型的值将会自动转换为double类型。但另一方面,有时也需要将double转换成int。在Java中,允许进行这种数值之间的类型转换,当然,有可能会丢失一些信息。在这种情况下,需要通过强制类型转换来实现这个操作。
强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,随后紧跟着待转换的变量名。
例如:
double x = 9.997;
int nx = (int)x;
这样,变量nx的值为9.强制类型转换将通过截断小数部分来把一个浮点值转换为整型。
如果想对浮点数进行舍入运算,得到最接近的整数(很多情况下我们会使用这种操作方式),就需要使用Math.round方法:
double x = 9.997;
int nx = (int) Math.round(x);
现在,变量nx的值为10。当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果位long类型,由于存在信息丢失的可能性,所以只有使用显示的强制类型转换才能将long类型转换成int类型。