javaj、条件判断中值精度问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > javaj、条件判断中值精度问题

javaj、条件判断中值精度问题

 2013/7/13 12:15:22  junzhou2013  程序员俱乐部  我要评论(0)
  • 摘要:条件判断时很容易忽略的问题就是数据精度,引起我思考这个问题是由于下面的代码privatedoublepi=Math.PI;privatedoublerockangle=pi/4;privatedoubleaddangle=pi/36;privateinta=1;for(inti=0;i<500;i++){if(a==1){rockangle=rockangle+addangle;if(rockangle==pi/3){a=2;System.out.println
  • 标签:Java 问题
  条件判断时很容易忽略的问题就是数据精度,引起我思考这个问题是由于下面的代码
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,那么也是相同的。


从表面上我就发现这么多,具体原因留待以后。







发表评论
用户名: 匿名