자바 의 추출 과 반올림 방법 인 스 턴 스
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);
}
총결산자바 에서 취사선택 과 반올림 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 의 취사선택 과 반올림 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.