条件判断时很容易忽略的问题就是数据精度,引起我思考这个问题是由于下面的代码
class="java" name="code">
private double pi=Math.PI;
private double rockangle=pi/4;
private double addangle=pi/36;
private int a=1;
for(int i=0;i<500;i++){
if(a==1){
rockangle=rockangle+addangle;
if(rockangle==pi/3){
a=2;
System.out.println("111111111111111111");
}
}
if(a==2){
rockangle=rockangle-addangle; if(rockangle==pi/6){
a=1;
System.out.println("222222222222222222");
}
System.out.println("rockangle="+rockange);
}
}
我的原意是让rockangle在30度角和60度角中来回摆动,但却
发现rockangle的值出现了负值! 最终发现是判断时数据的精度引发的问题,解决办法也很简单,用其他数据类型的变量去参与判断就可以了。
继续试验发现只有浮点型数据类型会发生这种情况:
1、double 和 double 类型的比较
public static void main(String[] args) {
//float和float 小数点后七位
//double和double 小数点后16位
//double 和 float比较 小数点后可以有0 但是不能有其他值 否则为不相等
double a=1.340000789;
double b=1.340000345;
if(a==b){
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
double 和 double 类型的比较, 会比较到小数点后16位 也就是说小数点后16位是相同的那么就是相同的,但要是小数点后16位内有一点点不同那么也是不相同的!(就是上面角度判断遇到的问题)
2、 float和float类型的比较:
这和double类型类似 ,只是会比较到小数点后七位。
3、float和double类型比较:
public static void main(String[] args) {
float a=1.00000000f;
double b=1.00000000;
if(a==b){
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
这有点不同,就是只能比较整数部分,小数点后有不为0的数存在,就是不相同的,但要是只有0,那么也是相同的。
从表面上我就发现这么多,具体原因留待以后。