浮点数精度问题
float num1=0.1f; double num2=1/10; System.out.println(num1==num2);
尝试输入以上代码,运行后会发现输出为false
float num3=112121212121212112f; float num4=num3+1; System.out.println(num3==num4);
再尝试运行以上代码,会发现输出为ture
1.这两个问题出现的原因都取决于float类型变量的性质,float变量能表示的数是离散的,有舍入误差,它表示的是一个约数,接近但不等于,所以在第一段代码中,num1不等于num2
2.第二个问题的出现,是由于float所表示的数是有限的,在第二段代码中,num3的数过大,导致无法被合法识别
解决方法:要完全避免使用浮点数进行比较,使用BigDecimal类即可
字符串引起的类型转换问题
int a=10; int b=20; String c = "1010"; System.out.println(""+a+b); System.out.println(a+b+"");
尝试运行以上代码,会发现输出依次为1020、30
出现这种结果的原因是:只要输出的前面出现了类型为String的变量,”+“就会变成连接符,在将后面的变量都转换为String类型后,直接连接并输出
而第二次输出30,是由于String类型的变量出现在a+b的后面,则会先进行a+b的运算,再将a+b的结果转换为String类型并于后面的String变量连接再输出
自动类型转换引发的问题
int num1=10_0000_0000; int num2=20; System.out.println(num1*num2); long num3 =num1*num2; System.out.println(num3); long num4=num1*((long)num2); System.out.println(num4);
尝试运行以上代码后,结果如上图
显然,第一次输出和第二次输出都是存在问题的
第一次出现问题的原因,显然是因为结果超出了int类型变量的最大值,输出自然无法预测
第二次输出时虽然num1和num2的乘积虽然会自动转换为long类型再输出,但num1*num2是在计算出结果后才转换的,转换前是int类型,结果已经溢出
第三次输出没有出现问题,是因为在计算前将num2强转为long类型,所以num1和num2都会先转换成long类型再进行运算,结果在long类型的范围内,所以不会有问题