javaj、条件判断中值精度问题
条件判断时很容易忽略的问题就是数据精度,引起我思考这个问题是由于下面的代码
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,那么也是相同的。
从表面上我就发现这么多,具体原因留待以后。