JavaRush /Java Blog /Random-KO /Java의 반올림 숫자

Java의 반올림 숫자

Random-KO 그룹에 게시되었습니다
부동 소수점 숫자(float, double)는 소수 정밀도가 필요한 표현식을 계산할 때 사용됩니다. 회계 및 기타 컴퓨팅 작업에는 높은 정확성이 필요한 경우가 많습니다. Java의 반올림 숫자 - 1하지만 소수점 뒤에 숫자의 긴 "꼬리"가 항상 필요한가요? 세 가지 실제 부품의 정확성이면 충분할까요? 그리고 우리는 이 옵션에 만족합니다. 반올림을 올바르게 수행하는 방법은 무엇입니까? 이것이 바로 오늘 우리가 이야기할 내용입니다. Java에서 숫자를 반올림하는 방법을 살펴보겠습니다 .

문자열 형식

첫 번째 방법으로 double을 반올림하는 방법을 살펴보겠습니다.
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
결과적으로 우리는 부동 소수점 숫자 34766674의 형식을 소수점 이하 3자리 의 정밀도로 형식화할 것 입니다. 형식 지정 지침에서 소수점 세 자리 "%.3f"를 지정했기 때문입니다. 결과적으로 문자열 형식을 지정할 때 %f는 부동 소수점 유형을 나타냅니다. Java에서 doublefloat 데이터 유형을 포함하는 숫자입니다 . 위의 예에서는 결과 값을 콘솔에 출력합니다. 이제 문제는 이 값을 어떻게 단축할 수 있느냐는 것입니다. 간단합니다. printf를 사용해야 합니다. 형식 + 인쇄입니다. 결과적으로 이전 예제는 다음과 같이 축소됩니다.
double value = 34.766674;
System.out.printf("%.3f",value);
이 메서드 외에도 PrintStream 클래스 의 out 인스턴스에는 유사하게 작동하는 형식 메서드도 있습니다.
double value = 34.766674;
System.out.format("%.3f",value);
HALF_UP 모드 에서는 잘리는 숫자에 더 가까운 숫자(0 또는 10)로 반올림이 발생합니다. 이 숫자가 등거리이면(5의 경우) 반올림이 수행됩니다. 예:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
아래에서 반올림 모드에 대해 더 자세히 설명하겠습니다. Java의 반올림 숫자 - 2

십진수 형식

또 다른 옵션은 DecimalFormat 클래스를 사용하는 것입니다 . 정수 또는 부동 소수점 숫자 등 Java에서 모든 숫자의 형식을 지정하도록 설계되었습니다. DecimalFormat을 인스턴스화할 때 형식 문자열을 전달할 수 있습니다. 입력 형식을 지정할 소수 자릿수를 나타냅니다. DecimalFormat을 사용하는 예제는 다음과 같습니다 .
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### 줄은 전달된 값의 형식을 소수점 이하 3자리로 지정함을 나타내는 패턴입니다. DecimalFormat 객체가 생성된 후 패턴을 변경하려면 해당 객체의 applyPatternapplyLocalizedPattern 메소드를 사용할 수 있습니다 .
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
하지만 오늘 우리는 반올림에 대해 이야기하고 있지 않습니까? 지정된 패턴을 벗어나는 소수 자릿수가 있는 숫자를 자를 때 DecimalFormat은 마지막 잘린 숫자가 5보다 크면 숫자를 반올림합니다. 그러나 숫자가 5이면 어떻게 될까요? 가장 가까운 정수 사이의 정확히 중간에 있다는 것이 밝혀졌습니다. 그럼 어쩌지? 이 경우 이전 번호가 고려됩니다. 짝수이면 반올림이 수행됩니다.
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
홀수이면 수행되지 않습니다.
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
String.format()과 DecimalFormat.format()을 사용하여 부동 소수점 숫자 형식을 지정하는 것에는 약간의 차이가 있습니다. 첫 번째는 소수 부분이 없더라도 항상 후행 0을 인쇄합니다. 예:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
보시다시피 숫자 7.000132를 소수점 세 자리로 형식화할 때 String의 format() 메서드는 7.000을 출력하고 DecimalFormat의 format() 메서드는 7을 출력합니다. 즉, String.format() 또는 DecimalFormat을 선택할 수 있습니다. ) 후행 0이 필요한지 여부에 따라 다릅니다. 위에서 설명한 방법을 사용하여 문자열 형식의 결과를 받았습니다. 정확한 숫자 값을 가져오는 방법을 살펴보겠습니다.

수학

숫자 를 사용한 다양한 산술 연산에 맞춰진 특수 클래스인 Math를 언급하지 않는 것은 불가능합니다 . Java의 반올림 숫자 - 3이 클래스에는 반올림을 위한 메소드도 있지만 이미 설명한 것과 달리 특정 소수 자릿수를 설정하는 것이 허용되지 않고 정수로 반올림됩니다.
  • Math.ceil()은 가장 가까운 정수로 반올림하지만 정수 유형이 아닌 double을 반환합니다.

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    34.0000000이 있더라도 Math.ceil을 사용한 후에도 여전히 35.0을 얻게 됩니다.

    Math.floor()는 가장 가까운 정수로 반올림하고 결과를 double로 반환합니다.

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    다시 말하지만, 값이 34.999999999이더라도 Math.floor를 사용한 후에 는 34.0을 얻게 됩니다.

  • Math.round () - 가장 가까운 정수로 반올림하여 결과를 int로 제공합니다.

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    숫자가 34.5이면 35로 반올림되지만, 34.499보다 약간 작으면 34로 잘립니다.

    단순히 전체 실수 부분을 잘라내는 것이 아니라 이 프로세스를 특정 소수 자릿수로 규제하고 동시에 반올림하기 위해 숫자에 10^n(10의 n승)을 곱합니다. 여기서 n 필요한 소수점 이하 자릿수와 같습니다. 그런 다음 Math 클래스의 일부 메서드를 사용하여 반올림한 다음 다시 10^n으로 나눕니다.

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - 두 개의 인수를 사용합니다. 첫 번째는 숫자이고 두 번째는 올려야 할 힘입니다.

BigDecimal을 사용한 반올림

BigDecimal 은 부동 소수점 숫자로 작업할 수 있는 클래스입니다. 특히, 주요 특징은 임의 길이의 분수를 저장할 수 있다는 것입니다(즉, 숫자의 범위에 제한이 없습니다). 또한 이 클래스는 반올림을 포함하여 산술 처리를 위한 다양한 메서드를 저장합니다. 이 객체의 클래스는 생성자를 double로 설정하고, 부동 소수점 숫자를 표시하는 문자열, double 및 MathContext 등을 설정하여 생성할 수 있습니다. MathContext는 RoundingMode 와 검색된 값의 전체 자릿수를 나타내는 숫자 의 조합입니다 . 반올림 규칙 RoundingMode: DOWN - 0을 향해 반올림합니다. UP - 0 모드에서 반올림. CEILING - 양의 무한대로 반올림됩니다. FLOOR - 음의 무한대로 반올림됩니다. HALF_UP - 두 이웃이 등거리가 아닌 경우(즉, 반올림되는 숫자가 5인 경우) "가장 가까운 이웃"으로 반올림합니다. 이 경우 반올림이 수행됩니다. HALF_DOWN - "가장 가까운 이웃"을 향해 반올림합니다. 두 이웃이 모두 등거리에 있지 않으면 이 경우 내림합니다. HALF_EVEN - 두 이웃이 등거리가 아닌 경우 "가장 가까운 이웃"으로 반올림합니다. 이 경우 짝수 이웃으로 반올림합니다(위에 설명된 DecimalFormat에서와 같이). UNNECESSARY - 요청한 작업의 결과가 올바른지 확인하는 데 사용됩니다. 따라서 반올림이 필요하지 않습니다. 예:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
생성자에서 반올림 규칙을 설정하는 기능 외에도 BigDecimal을 사용 하면 인스턴스가 생성된 후 반올림 모드를 설정할 수 있습니다. 이렇게 하려면 소수 자릿수와 반올림 규칙을 설정해야 하는 setScale 메소드를 사용하십시오.
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal 에는 반올림 모드( ROUND_DOWN , ROUND_CEILING , ROUND_FLOOR ...)를 설정하도록 설계된 내부 int 변수 도 있습니다. 이는 RoundingMode 클래스 에 제시된 것과 유사한 반올림 규칙을 나타내며 setScale 에서도 유사하게 사용됩니다 .
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
이 기사 에서 BigDecimal 클래스에 대해 자세히 알아보세요 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION