자바 기초 부동 소수점 연산

전체 데이터 와 달리 부동 소수점 은'기호 비트+지수+유효 비트(끝자리)'의 저장 방식 으로 이러한 저장 의 특수성 에 있 기 때문에 4 바이트 만 차지 하 는 float 형식 데 이 터 는 8 바이트 의 log 형식 데이터 보다 더 큰 수치 범 위 를 가 질 수 있다.그러나 이것 도 일정한 대 가 를 치 러 야 한다.구체 적 인 상황 은 다음 과 같다.1.부동 소수점 은 부동 소수점 을 비슷 하 게 저장 하 는 결함 1
public class FloatTest1 {
      public static void main(String[] args) {
            int intMax=Integer.MAX_VALUE;
            int intMin=Integer.MIN_VALUE;
            long longMax=Long.MAX_VALUE;
            long longMin=Long.MIN_VALUE;
            float fintMax=intMax;
            float fintMin=intMin;
            double dlongMax=longMax;
            double dlongMin=longMin;
            System.out.println(“int       :”+intMax);
            System.out.println(“  float    :”+fintMax);
            System.out.println(“int       :”+intMin);
            System.out.println(“  float    :”+fintMin);
            System.out.println(“long       :”+longMax);
            System.out.println(“  float    :”+dlongMax);
            System.out.println(“long       :”+longMin);
            System.out.println(“  float    :”+dlongMin);
      }
}

실행 결 과 는 다음 과 같다.int 유형의 최대 치 는 2147483648 에서 float 를 사용 하여 저장 한 후:2.14748365E9 int 유형의 최소 치 는:-2147483648 에서 float 를 사용 하여 저장 한 후:-2.14748365E9 long 유형의 최대 치 는 9223373686854775807 에서 float 를 사용 하여 저장 한 후:9.223736854776 E18 long 유형의 최소 치 는:-9223372036854775808 에서 float 를 사용 하여 저장 한 후:-9.22372036854776 E18 결 과 를 통 해 알 수 있 듯 이 float 형식의 변 수 를 사용 하여 수 치 를 저장 하 든 doubel 형식의 변수 로 수 치 를 저장 하 든 모두 일정한 정밀도 가 손실 되 었 고 부동 소수점 으로 출력 할 때 정확 한 결 과 를 출력 하지 못 했다.부동 소수점 결함 2.부동 소수점 을 테스트 하여 작은 데 이 터 를 저장 합 니 다.
public class FloatTest2 {
      public static void main(String[] args) {
            for(float f=0.1f;f<1;f+=0.1){
                  System.out.println(f);
            }
            for(double d=0.1f;d<1;d+=0.1){
                  System.out.println(d);
            }
      }
}

운행 결 과 는 다음 과 같다.그러나 결 과 는 이처럼 만 족 스 럽 지 못 했다.두 가지 예 를 통 해 알 수 있 듯 이 저 장 된 수치 든 작은 수치 든 부동 소수점 은 매우 정확 하지 않다.부동 소수점 은 컴퓨터 에서 비슷 한 저장 일 뿐 1/3 과 같은 무한 소수 로 부동 소수점 으로 도 정확하게 표시 할 수 없다.여기 서 주의해 야 할 것 은 두 번 째 예 에서 우 리 는 0.1~0.6 의 출력 결과 가 정확 하고 0.7 부터 오차 가 발생 하 는 것 을 보 았 다 는 것 이다.사실은 우리 눈 이 속 았 어.float f=0.1f 를 실행 할 때 컴퓨터 의 데 이 터 는 순수한 0.1 이 아니 라 0.1000~000xxx 와 유사 한 형식 입 니 다.그 중에서 000~000 은 몇 개의 0 을 표시 하고 xxx 는 몇 개의 숫자 를 표시 합 니 다.그 데 이 터 를 0.100000011111 이 라 고 가정 하면 folat 유형 은 7~8 비트 의 유효 숫자 만 유지 할 수 있 습 니 다.그러면 중간 에서 차단 되 어 float 저장 의 값 은 0.1000000 이 됩 니 다.즉 부동 소수점 수치 0.1.2.부동 소수점 크기 비교
public class FloatTest3 {
      public static void main(String[] args) {
            double d1=0.1;
            double d2=0.2;
            double d3=d1+d2;
            if(d1+d2==0.3){
                 System.out.println(“d1+d2==0.3″);
            }else{
                 System.out.println(“d1+d2!=0.3″);
                 System.out.println(d3);
            }
      }
} 

결 과 는 다음 과 같다:d1+d2!=0.3 0.300000000000004 는 부동 소수점 저장 에 일정한 오차 가 있 으 므 로 부동 소수점 으로 똑 같은 비 교 를 하지 말고 혼합 비교 도 하지 말 라 는 것 을 다시 한 번 설명 한다(예 를 들 어 int 와 float 의 비교).3.수량 급 의 차이 가 매우 클 때 부동 소수점 의 연산 은 부동 소수점 을 사용 할 때 주의해 야 한다.그것 은 수량 급 의 차이 가 너무 큰 수 사이 에 가감 연산 을 하지 않 는 것 이다.그러면 원수 급 의 비교적 큰 조작 수 를 바 꿀 수 없 을 것 이다.상황:
public class FloatTest4 {
      public static void main(String[] args) {
            float f1=16777216f;
            float f2=f1+1;
            if(f1==f2){
                System.out.println(“f1  f2″);
            }else{
                 System.out.println(“f1   f2″);
            }
            System.out.println(“f1=”+f1);
            System.out.println(“f2=”+f2);
      }
}

결 과 는 다음 과 같다.f1 은 f2 f1=1.6777216E 7 f2=1.6777216E 7 과 같다.이것 은 부동 소수점 의 내부 표시 와 관련 이 있다.여 기 는 부동 소수점 의 복잡 한 저장 원 리 를 무시 할 필요 가 없다.부동 소수점 은 비슷 한 저장 일 뿐 이 고 그 저장 값 이 클 수록 손실 의 정밀도 도 클 수록 수량 급 차이 가 큰 가감 요 소 를 누 르 면 원 하 는 결 과 를 얻 지 못 할 것 이다.무슨 문제 나 견해 가 있 으 면 환영 합 니 다팔 영 객 단체 블 로그토론 하 러 오 세 요.80 객 팀 구성원 은 언제든지 환영 합 니 다!추 후 결과 의 정확성 을 확보 하 는 자바 류 에 대해 설명 하 겠 습 니 다.
본문

좋은 웹페이지 즐겨찾기