Programing

정수 나누기를 반올림하고 Java에서 int 결과를 얻는 방법은 무엇입니까?

lottogame 2020. 10. 11. 08:59
반응형

정수 나누기를 반올림하고 Java에서 int 결과를 얻는 방법은 무엇입니까?


이 질문에 이미 답변이 있습니다.

휴대 전화 SMS의 페이지 수를 세는 아주 작은 방법을 썼습니다. 를 사용하여 반올림 할 수있는 옵션이 없었고 Math.ceil솔직히 매우 추한 것 같습니다.

내 코드는 다음과 같습니다.

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
   String message = "today we stumbled upon a huge performance leak while optimizing a raycasting algorithm. Much to our surprise, the Math.floor() method took almost half of the calculation time: 3 floor operations took the same amount of time as one trilinear interpolation. Since we could not belive that the floor-method could produce such a enourmous overhead, we wrote a small test program that reproduce";

   System.out.printf("COunt is %d ",(int)messagePageCount(message));



}

public static double messagePageCount(String message){
    if(message.trim().isEmpty() || message.trim().length() == 0){
        return 0;
    } else{
        if(message.length() <= 160){
            return 1;
        } else {
            return Math.ceil((double)message.length()/153);
        }
    }
}

저는이 코드가별로 마음에 들지 않으며보다 우아한 방법을 찾고 있습니다. 이것으로 나는 3.0000000이 아니라 3을 기대하고 있습니다. 어떤 아이디어?


정수 나눗셈을 반올림하려면 다음을 사용할 수 있습니다.

import static java.lang.Math.abs;

public static long roundUp(long num, long divisor) {
    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1);
    return sign * (abs(num) + abs(divisor) - 1) / abs(divisor);
}

또는 두 숫자가 모두 양수이면

public static long roundUp(long num, long divisor) {
    return (num + divisor - 1) / divisor;
}

Math.ceil()결과를 사용 하고 int로 캐스트하십시오.

  • 이것은 abs ()를 사용하여 복식을 피하는 것보다 더 빠릅니다.
  • -0.999는 0으로 반올림되므로 결과는 음수로 작업 할 때 정확합니다.

예:

(int) Math.ceil((double)divident / divisor);

너무 복잡하지 않은 또 다른 한 줄 :

private int countNumberOfPages(int numberOfObjects, int pageSize) {
    return numberOfObjects / pageSize + (numberOfObjects % pageSize == 0 ? 0 : 1);
}

int 대신 long을 사용할 수 있습니다. 매개 변수 유형과 반환 유형을 변경하기 만하면됩니다.


Google의 Guava 라이브러리 는 IntMath 클래스에서이를 처리합니다 .

IntMath.divide(numerator, divisor, RoundingMode.CEILING);

여기의 많은 답변과 달리 음수를 처리합니다. 또한 0으로 나누려고 할 때 적절한 예외가 발생합니다.


(message.length() + 152) / 153

이것은 "반올림 된"정수를 제공합니다.


long numberOfPages = new BigDecimal(resultsSize).divide(new BigDecimal(pageSize), RoundingMode.UP).longValue();

a를 b로 반올림하여 계산하려면 (a + (-a % b)) / b를 사용할 수 있습니다.


Peter의 솔루션을 확장하면 다음과 같이 항상 '양의 무한대로'반올림 할 수 있습니다.

public static long divideAndRoundUp(long num, long divisor) {
    if (num == 0 || divisor == 0) { return 0; }

    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1);

    if (sign > 0) {
        return (num + divisor - 1) / divisor;
    }
    else {
        return (num / divisor);
    }
}

이것은 도움이 될 수 있습니다, 나머지를 legnth로 빼서 나눌 수있는 숫자로 만든 다음 153으로 나눕니다.

int r=message.length()%153;       //Calculate the remainder by %153
return (message.length()-r)/153;  // find the pages by adding the remainder and 
                                  //then divide by 153 

참고 URL : https://stackoverflow.com/questions/7446710/how-to-round-up-integer-division-and-have-int-result-in-java

반응형