Java核心技术速学版(第3版)
上QQ阅读APP看书,第一时间看更新

1.4.4 数值的类型转换

当运算符的操作数是不同的数值类型时,在运算之前,这些数值会自动转换为一个通用的类型。转换是按照以下顺序进行的。

如果两个操作数中有一个为double类型,则另一个将转换为double类型。

如果其中一个操作数是float类型,则另一个将转换为float类型。

如果其中一个操作数是long类型,则另一个将转换为long类型。

否则,两个操作数都转换为int类型。

例如,如果计算3.14 + 42,那么第二个操作数将会从int类型转换为double类型的值42.0,然后进行加法计算,得到double类型的值45.14。

如果计算 'J' + 1,则char类型的值'J'将被转换成为int类型的值74,最后结果为int类型的值75。至于如何将该值转换回char类型,还需要继续阅读后面的内容。

当你将数值类型的值赋值给一个变量,或将其作为参数传递给一个方法时,如果类型不匹配,则必须转换该值的类型。例如,在以下赋值中,值42会自动从int类型转换为double类型。

double x = 42;

在Java中,如果没有精度损失,那么将发生以下形式的转换:

从byte类型到short类型、int类型、long类型,或者double类型;

从short类型和char类型到int类型、long类型,或者double类型;

从int类型到long类型或者double类型。

所有的整数类型都会被转换成为浮点类型。

警告:以下转换可能会丢失精度信息。

从int类型到float类型。

从long类型到float类型或double类型。

例如,考虑以下赋值:

float f = 123456789;

因为float类型只有7位有效数字,所以f实际上是1.23456792E8。

为了实现这些自动转换之外的类型转换,需要使用强制类型转换运算符,强制类型转换的语法格式是在圆括号中指定目标类型的名称。例如:

double x = 3.75;
int n = (int) x;

在这种情况下,小数部分将会被舍弃,n会被设置为3。

如果想四舍五入到最接近的整数,可以使用Math.round方法,该方法返回一个long类型的值。如果明确知道结果更加适合int类型,可以调用:

int n = (int) Math.round(x);

在这个示例中,x为3.75,n被设置为4。

如果需要将整数类型转换为另一个字节更少的类型,也需要使用强制转换:

int n = 1;
char next = (char)('J' + n); // Converts 75 to 'K'

在这种强制转换中,只保留最后的字节,例如:

int n = (int) 3000000000L; // Sets n to -1294967296

注意:如果担心强制类型转换会无警告地丢弃数值的重要部分,那么可以使用Math.toIntExact方法。当该方法无法将long类型转换为int类型时,就会产生异常。