자바 의 추출 과 반올림 방법 인 스 턴 스

1.자바 에서 정 수 를 취 하 는 방식
1.직접 강제 전환 사용

public static void roundOne(){
  System.out.println("  :(int)10.12 = " + (int)10.12); 
  System.out.println("  :(int)-10.12 = " + (int)-10.12); 
  System.out.println("---------------------------------");
  System.out.println("  :(int)1011111111111111111111.12 = " + (int)1011111111111111111111.12); 
  System.out.println("  :(int)-1011111111111111111111.12 = " + (int)-1011111111111111111111.12); 
 }
직접 강제 변환 방식 으로 부동 소수점 데 이 터 를 정형 으로 변환 할 때 소수점 뒷부분 의 정 도 를 직접 제거 하고 정수 부분 을 취한 다.직접적 으로 정밀도 위험 을 강제 하 는 것 은 한편 으로 는 작은 디지털 손실 이 고 다른 한편 으로 는 부동 소수점 숫자 가 전체 디지털 의 최대 치 를 초과 할 때 넘 칠 수 있다.실제 공사 에서 이 두 가지 요소 가 공사 에 영향 을 미 치지 않 으 면 사용 할 수 있 고 그렇지 않 으 면 사용 을 권장 하지 않 는 다.
2.자바 에서 제공 하 는 추출 함수
자바 에서 세 가지 추출 함 수 를 제공 합 니 다:
  (1).Math.ceil(double num);
  (2).Math.floor(double num);
  (3).Math.round(double num);

 public static void roundTwo(){
  System.out.println("  :Math.ceil(10.12) = " + Math.ceil(10.12));
  System.out.println("  :Math.ceil(-10.12) = " + Math.ceil(-10.12));
  System.out.println("  :Math.ceil(101111111111111111111.12) = " + Math.ceil(101111111111111111111.12));
  System.out.println("  :Math.ceil(-101111111111111111111.12) = " + Math.ceil(-101111111111111111111.12));
  System.out.println("---------------------------------");
  System.out.println("  :Math.floor(10.12) = " + Math.floor(10.12));
  System.out.println("  :Math.floor(-10.12) = " + Math.floor(-10.12));
  System.out.println("  :Math.floor(101111111111111111111.12) = " + Math.floor(101111111111111111111.12));
  System.out.println("  :Math.floor(-101111111111111111111.12) = " + Math.floor(-101111111111111111111.12));
 }
Math.ceil(double num);함 수 는 부동 소수점 을 취 하 는 천장 수,즉 num 보다 작 지 않 은 최소 정수 입 니 다.Math.floor(double num)함 수 는 마루 수,즉 num 보다 크 지 않 은 최대 정수 입 니 다.이 두 함수 의 반환 값 은 모두 double 형(자바 에서 그 값 이 9999999.0 보다 클 때 기본적으로 과학 기수 법 으로 표시)이 며,특수 한 상황 이 없 거나 규칙 이 명확 하 다 면 하나의 규칙 이다.

public static void roundThree(){
  System.out.println("       =5"); 
  System.out.println("  :Math.round(10.5) = " + Math.round(10.5)); 
  System.out.println("  :Math.round(-10.5) = " + Math.round(-10.5)); 
  System.out.println(); 
 
  System.out.println("       <5"); 
  System.out.println("  :Math.round(10.46) = " + Math.round(10.46)); 
  System.out.println("  :Math.round(-10.46) = " + Math.round(-10.46)); 
  System.out.println(); 
 
  System.out.println("       >5"); 
  System.out.println("  :Math.round(10.68) = " + Math.round(10.68)); 
  System.out.println("  :Math.round(-10.68) = " + Math.round(-10.68));
 }
Math.round(double num)함 수 는 추출 함수 입 니 다.이 함 수 는 소수점 뒤의 첫 번 째 작은 수치 에 만 관심 을 가지 고 구체 적 인 규칙 은 다음 과 같 습 니 다.
(1).매개 변수의 소수점 후 첫 번 째<5,연산 결 과 는 매개 변수 정수 부분 입 니 다.
(2).매개 변수의 소수점 후 첫 번 째>5,연산 결 과 는 매개 변수 정수 부분의 절대 치+1 이 고 기호(즉 양음)는 변 하지 않 습 니 다.
(3).매개 변수의 소수점 후 첫 번 째=5,정수 연산 결 과 는 정수 부분+1 이 고 음수 연산 결 과 는 정수 부분 이다.
총 결:5 보다 크 면 5 정수 가 되 고 5 보다 작 으 면 모두 가 되 지 않 는 다.
2.자바 중 반올림 하 는 방법
1.BigDecimal 대상 을 사용 하 는 방식

public static void roundFour(){
  double f = 10.2345;
  BigDecimal b0 = new BigDecimal(f);
  BigDecimal b1 = new BigDecimal(f);
  BigDecimal b2 = new BigDecimal(f);
  BigDecimal b3 = new BigDecimal(f);
  BigDecimal b4 = new BigDecimal(f);
  BigDecimal b5 = new BigDecimal(f);
  BigDecimal b6 = new BigDecimal(f);
  BigDecimal b7 = new BigDecimal("10.2345");
  
  double f0 = b0.setScale(3, BigDecimal.ROUND_UP).doubleValue();
  double f1 = b1.setScale(3, BigDecimal.ROUND_DOWN).doubleValue();
  double f2 = b2.setScale(3, BigDecimal.ROUND_CEILING).doubleValue();
  double f3 = b3.setScale(3, BigDecimal.ROUND_FLOOR).doubleValue();
  double f4 = b4.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
  double f5 = b5.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  double f6 = b6.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  double f7 = b7.setScale(4, BigDecimal.ROUND_UNNECESSARY).doubleValue();
  
  System.out.println(f + "          (ROUND_UP)         :" + f0);
  System.out.println(f + "          (ROUND_DOWN)         :" + f1);
  System.out.println(f + "           (ROUND_CEILING)         :" + f2);
  System.out.println(f + "           (ROUND_FLOOR)         :" + f3);
  System.out.println(f + "         (5 )(ROUND_HALF_UP)         :" + f4);
  System.out.println(f + "         (5 )(ROUND_HALF_DOWN)         :" + f5);
  System.out.println(f + "         (ROUND_HALF_EVEN)         :" + f6);
  System.out.println(f + "          (ROUND_UNNECESSARY)     :" + f7);
 }
BigDecimal 에는 8 중 반올림 설정 방식 이 있 습 니 다.
(1).ROUND_up:0 방향 에서 벗 어 나 반올림.절대 값 이 가장 큰 방향 으로 반올림 하고 자 리 를 버 리 면 0 이 아니면 바로 들 어 갑 니 다.
(2).ROUND_DOWN:제로 방향 으로 반올림 합 니 다.절대 값 이 가장 작은 방향 으로 입력 하면 모든 위 치 를 버 리 고 진 위 는 존재 하지 않 습 니 다.
(3).ROUND_CEILING:정 무한 방향 으로 반올림.정 최대 방향 으로 접근 하 다.정수 라면 반올림 행 위 는 ROUND 와 유사 합 니 다.UP,마이너스 라면 반올림 행 위 는 ROUND 와 유사 합 니 다.DOWN。Math.round()방법 은 이 모드 를 사용 합 니 다.
(4).ROUND_FLOOR:마이너스 무한 방향 으로 반올림.마이너스 무한 방향 으로 접근 하 다.정수 라면 반올림 행 위 는 ROUND 와 유사 합 니 다.DOWN;마이너스 라면 반올림 행 위 는 ROUND 와 유사 합 니 다.UP。
(5).ROUND_HALF_UP:최근 숫자 반올림(5 진).이것 은 우리 의 가장 전형 적 인 반올림 이다.
(6).ROUND_HALF_DOWN:최근 숫자 반올림(5 사).여기 서 5 는 버 려 야 한다.
(7).ROUND_HALF_EVEN:은행 가 반올림 법.
(8).ROUND_UNNECESSARY:계산 결 과 는 정확 하 므 로 반올림 모드 가 필요 없습니다.
    a.ROUND_HALF_DOWN 설명
    제(6)중 반올림 방식 ROUNDHALF_DOWN 은 5 를 만나면 버 려 야 한다 고 설 명 했 지만 10.2345 는 3 자리 소 수 를 유지 한 결과 10.235 로 정확 한 5 를 직접 버 리 지 않 았 다.아니면 1 을 넣 었 다.왜 일 까?

public static void roundFive(){
  //  double         BigDecimal  
  double f = 10.2345;
  BigDecimal b5 = new BigDecimal(f);
  System.out.println("b5:" + b5);
  double f5 = b5.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  System.out.println("ROUND_HALF_DOWN     :" + f5);
  System.out.println("----------------------------");
  //              BigDecimal  
  BigDecimal b5_1 = new BigDecimal("10.2345");
  System.out.println("b5_1:" + b5_1);
  double f5_1 = b5_1.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  System.out.println("ROUND_HALF_DOWN     :" + f5_1);
  System.out.println("----------------------------");
  //   5      0,        ,    5
  BigDecimal b5_2 = new BigDecimal("10.23450");
  System.out.println("b5_2:" + b5_2);
  double f5_2 = b5_2.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  System.out.println("ROUND_HALF_DOWN     :" + f5_2);
  System.out.println("----------------------------");
  
  //   5    0   ,        ,  1
  BigDecimal b5_3 = new BigDecimal("10.234501");
  System.out.println("b5_3:" + b5_3);
  double f5_3 = b5_3.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  System.out.println("ROUND_HALF_DOWN     :" + f5_3);
  System.out.println("----------------------------");
 }
    예 를 들 어 10.2345 는 ROUND 를 통 해HALF_DOWN 방식 으로 세 개의 소 수 를 유지 한 결과 10.235 로 나 온 이 유 는 사용 한 double 유형 이 초기 화 되 어 생 긴 BigDecimal 대상 의 경우 실제 실례 화 된 수 치 는 10.2345 가 아니 라 10.23450000000000596858980384131744384765625 로 5 뒤에 다른 소수 가 있 을 때 도 1 위로 전진 하 는 것 으로 나 타 났 기 때문이다.그 러 니까 ROUND 를 사용 하면HALF_DOWN 방식 때 모든 5 를 그냥 버 리 는 것 이 아니 라 5 뒤에 다른 0 자리 가 있 는 지,없 으 면 그냥 버 리 고 있 으 면 1 을 들 어가 야 한다.
    b.은행 가 알고리즘
    반올림 은 사실 금융 방면 에서 매우 많이 운용 되 는데,특히 은행 의 이자 가 그렇다.우 리 는 모두 은행 의 이윤 창 출 경 로 는 주로 금 리 차 라 는 것 을 알 고 있다.그것 은 예금주 에 게 서 자금 을 수집 한 다음 에 대출 을 해 주 는 것 이다.그 동안 발생 하 는 금 리 차 는 바로 은행 이 얻 은 이윤 이다.만약 에 우리 가 평소에 반올림 하 는 규칙 을 채택 한다 면 여 기 는 10 건의 예금 이자 계산 을 모델 로 한다.다음 과 같다.
사사:0.000,0.001,0.002,0.003,0.004.이 집 들 은 모두 은행 에서 번 돈 이다.
5 입:0.005,0.006,0.007,0.008,0.009.이것들 은 모두 은행 에서 손 해 를 본 돈 이다.
각각 0.005,0.004,0.003,0.002,0.001 이다.
    그래서 은행 에 있어 서 그의 이윤 은 0.000+0.001+0.002+0.003+0.004-0.005-0.003-0.002-0.001=-0.0005 가 되 어야 한다.결과 에서 알 수 있 듯 이 10 건 당 이자 은행 은 0.005 위안 의 손실 을 볼 수 있 으 니 절대 이 숫자 를 얕 보지 마라.이것 은 은행 에 있어 서 매우 큰 손실 이다.이 문제 에 직면 하여 다음 과 같은 은행 가 섭외 법 이 생 겼 다.이 알고리즘 은 미국 은행 가 들 이 제기 한 것 으로 주로 위의 반올림 규칙 을 사용 하여 발생 하 는 오 차 를 수정 하 는 데 쓰 인 다.다음 과 같다.
(1).자 리 를 버 리 는 수치 가 5 보다 적 으 면 바로 버린다.
(2).버 리 는 위치의 수치 가 5 보다 크 면 들 어간 후에 버린다.
(3).반올림 의 수치 가 5 와 같 을 때 5 뒤에 0 이 아 닌 수치 가 있 으 면 진위 후 반올림 하고 5 뒤에 0 이 있 을 때 5 앞 자리 수의 패 리 티 에 따라 홀수 진위,짝수 반올림 을 판단 한다.
위의 규칙 에 대해 우 리 는 예 를 들 어 설명 한다.
11.556 = 11.56          ------육입
11.554 = 11.55          -----사방
11.5551 = 11.56         -----5 후 에는 수 진 이 있다.
11.545 = 11.54          -----다섯 후 에는 무수 하지만,앞 자리 가 짝수 라면 버 려 야 한다.
11.555 = 11.56          -----다섯 후 에는 무수 하지만,만약 앞 자리 가 홀수 라면 마 땅 히 진위 해 야 한다.
    c.ROUND_UNNECESSARY 설명
   ROUND_UNNECESSARY 방식 은 계산 결과 가 정확 하 다 는 것 을 나타 내 며,정확 하지 않 으 면 자바.lang.Arithmetic Exception 이상 을 던 집 니 다.

public static void roundSix(){
  BigDecimal b7 = new BigDecimal("10.23455");
  double f7 = b7.setScale(4, BigDecimal.ROUND_UNNECESSARY).doubleValue();
  System.out.println("ROUND_UNNECESSARY     :" + f7);
 }
BigDecimal b7=new BigDecimal("10.23455")의 숫자 를 10.2345 또는 10.23450000 으로 변경 하면;정상적으로 운행 할 수 있다.즉,ROUND 사용UNNECESSARY 방식 의 경우 부동 소수점 이 N 비트 소 수 를 유지 할 때 숫자의 정밀도 에 영향 을 주지 않 으 며,숫자 를 버 려 정밀도 가 영향 을 받 으 면 이상 을 던진다.
주:이러한 매 거 진 값 은 가끔 RoundingMode 류 의 매 거 진 값 을 사용 합 니 다.사실은 효과 가 똑 같 습 니 다.RoundingMode 는 BigDecimal 중의 매 거 진 값 을 한 층 더 봉 하여 매 거 진 이름 을 간소화 하고 실질 적 인 차이 가 없습니다.RoundingMode 매 거 진 클래스 의 매 거 진 예제:UP(BigDecimal.ROUNDUP),
2.DecimalFormat 대상 을 사용 하 는 방식

public static void roundSeven(){
  DecimalFormat df = new DecimalFormat("#.000");
  //df.setRoundingMode(RoundingMode.DOWN);
  System.out.println(df.format(new BigDecimal(10.2345)));//10.235
 }
주:DecimalFormat 은 기본적으로 RoundingMode.HALF 를 사 용 했 습 니 다.EVEN 이라는 유형 은 setRounding Mode 방법 을 통 해 반올림 방식 을 설정 할 수 있 으 며,format 이후 결 과 는 문자열 형식 String 입 니 다.
3.String.format 방식 사용

public static void roundEight(){
  double d = 10.2345;
  String result = String.format("%.3f", d);
  System.out.println("result:" + result);
 }
출력 은 10.235 입 니 다.String.format 는 정수,부동 소수점,문자열,날짜 등 여러 유형의 데 이 터 를 포맷 할 수 있 습 니 다.부동 소수점 의 포맷 규칙 에 대해 자세히 소개 할 수 있 습 니 다.여 기 는 부동 소수점 의 반올림 만 알 면 됩 니 다.
4.Math.round 방식 사용

public static void roundNine(){
  double d1 = Math.round(5.2644555*100)*0.01d;
  System.out.println("d1:" + d1);
  
  double d2 = Math.round(5.2654555*100)*0.01d;
  System.out.println("d2:" + d2);
 }
Math.round()방식 은 사용 을 권장 하지 않 습 니 다.예 를 들 어 위험 이 있 기 때 문 입 니 다.
5.NumberFormat 방식 사용

public static void roundTen(){
  double d = 10.2345;
  NumberFormat nf=NumberFormat.getNumberInstance() ;
  nf.setMaximumFractionDigits(2);
  String s= nf.format(d) ;
  System.out.println("s1:" + s);
  
  nf.setMaximumFractionDigits(3);
  s= nf.format(d) ;
  System.out.println("s2:" + s);
 }
총결산
자바 에서 취사선택 과 반올림 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 의 취사선택 과 반올림 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기