前言
经常需要将一些数值类型转换为另外一种数值类型。下图给出了数值类型之间的合法转换。
数值型数据类型
在上图中有6个实线箭头,表示无信息丢失的转换;另外有3个虚线箭头,表示可能有精度损失的转换。例如,123456789是一个大整数,它包含的位数多于float类型所能表示的位数,将这个整数转换为float类型时,数量级时正确的,但时会损失一些精度。
代码语言:javascript复制int n = 123456789;
float f = n; //f 的值为1.234567892EB
当用一个二元运算符连接两个值时(例如 n f,n是整数,f是浮点数),先要将两个操作数转换为同一类型,然后在进行计算,通常为小类型转换为大类型。(如浮点型和整数进行连接时,最终的返回值为浮点型)。
其中七大数值型数据类型分别为: 整数型:byte、short、int、long 浮点型:float(单精度)、doubles(双精度) 字符型:char 各数值型占用内存大小: 1byte = 8bit 1short = 2byte = 16bit 1int = 4byte = 2short = 32bit 1long = 8byte = 4short = 2int = 64bit 1float = 4byte = 32bit 1double = 8byte = 2float = 64bit 1char = 2byte = 16bit
数值型数据进行拼接时的规则:
- 如果两个操作数中有一个是double类型,另外一个操作数就会转换为double类型。
- 否则,如果其中一个操作数是float类型,另外一个操作数就会转换为float类型。
- 否则,如果其中一个操作数是long类型,另外一个操作数将会转换为long类型。
- 否则,两个操作数都会被转换为int类型。
数值型强制类型转换
在必要的时候,int类型的值会自动转换为double类型。但另一方面,有时我们也需要将double类型转换成int类型。在Java中允许这种数据类型的转换,不过可能会丢失一些信息。这种转换要通过强制类型转换来实现,强制类型转换的语法格式是在原括号中指定想要转换的目标类型,后面紧跟需要转换的变量名或者常量。例如:
代码语言:javascript复制 double x = 9.997;
int nx = (int) x; //nx的值为9
这样,变量nx的值为9,因为强制类型转换通过截取小数部分将浮点值转换为整型。如果想将一个浮点型转换为整型时进行舍入,可以使用 Math.round()
方法来实现,例如:
double x = 9.997;
int nx = (int) Math.round(x); // nx的值为10
调用round()方法时,仍需强制类型(int)转换,原因是round()方法返回的是一个long类型,由于存在信息丢失的可能性,所以只有通过一个显式的强制类型转换才能将一个long类型值赋值给int类型的变量。