基本数据类型的运算问题
①float x = 1;与float x = 1.0f
这两种对于float类型的变量来说定义的方式都是正确的,也是比较常见的笔试题里面考察类型转换的例子。
当第一种情况时,是将低精度int向上转型到float,是由于java的特性导致而不需要进行强制转换,
而第二种情况则是比较正式的对于float变量的定义,由于这种类型本身在工作项目中并不常见,常用的带小数的数字我们一般都直接使用double类型,而double类型直接定义是没有问题的:double x = 1.0。
而由于float的精度没有double类型高,因此必须对其进行显示的格式书写,如果没有这个f,就默认是double类型了。当然double x = 1.0d也是正确的命名,不信你可以尝试,虽然这是一个令人窒息的操作。
②当多个精度的数字同时进行运算时,最终结果以最高精度为准。
在多数情况下,整数和小数的各级混合运算中,一般结果都是double类型的。
但就本题而言,结果是float类型的,因为x,y两个数字精度最高的就是float,所以最终结果是0.5,并且这个0.5是float类型的。
为什么说不是double类型呢,当然如果你这样处理:double m = x/y,当然m是double类型的,也不会报错,而如果你写成int m = x/y,编译器报错提示的时候就会让你转换成float或者进行强制转换成int,他是不会提示你转换成double的,尽管这么写并没有报错,原因就是①中所说的向上强转。float转换成double不需要任何提示。
概述:
多数据类型参与运算时,最终结果以最高精度为准。
java中可以默认向上转型:byte-short-int-long-float-double
例子:
public static void main(String[] args) {
int i = 1;
float j = 2.0f;
//如果用int接收,编译器提示b的类型是float,不会提示强转成double(因为此处的最高类型是float)
//最终结果是float类型的0.5
float b = i/j;
//当然也可以用double来接收,此时就是,自动向上转型 float->double
double y = i/j;
System.out.println(b);
System.out.println(y);
//float的标准定义写法
float c = 0.5f;
//自动向上转型 int->float
float t = 5;
//double 类型的两种写法都正确
double d = 0.5;
double e = 0.6d;
//自动向上转型 int-》double
double f = 6;
}
第二种运算:
如下赋值语句有什么问题:
short i = 1;
i = i + 1;//1
short j = 1;
j += 1;//2
结果:1.编译器提示错误 2.正常
分析:这道题首先需要明白在java规范中:高位转低位需要显式强制转换 ,低位转高位会隐式的进行转换;byte short char 参与运算时,会先自动转换为int类型。
题目首先要在抓住赋值的操作,在1处[short]+[int]会得到[int]的结果,[short] = [int]赋值过程中缺少显式类型转换,正确的写法应该是i=(short) (i + 1);。而2处,这是一种复合赋值操作,它会自动地将所执行计算的结果转型为其左侧变量的类型,即j += 1等价于j=(short) (j + 1),所以能够正确执行。