2011-09-16 2 views
59

나는 방금 휴대폰 SMS 용 페이지 수를 세는 작은 방법을 썼다. 나는 Math.ceil을 사용하여 반올림하는 옵션을 가지고 있지 않았으며 솔직히 매우 추한 것 같습니다. 나는이 코드 조각처럼 정말하지 않습니다정수 나누기를 반올림하고 int 결과를 Java로 작성하는 방법은 무엇입니까?

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을 기대하고있다. 어떤 아이디어?

+1

[정수 나누기 결과를 올림하는 방법] 가능한 복제본 (http : // stackoverflow.com/questions/17944/정수법 결과의 반올림) – Raedwald

답변

79

당신이

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; 
} 
+0

이 방법은'num> = 0'에서만 작동합니다. – user905686

+0

양의 무한대로 올림합니다. 다른 옵션 인 0에서 멀리 떨어지지 않습니다. –

+2

제 말은'num = -2'와'div = -3'입니다. 이것은'-6/-3 = 2'에서 끝나지 만'0,666..'은 '1'로 반올림되어야합니다. 실제로'num <= 0 && div <= 0'에 대해서는 작동하지 않습니다. – user905686

10
(message.length() + 152)/153 

이렇게하면 "올림"정수가됩니다.

0

긍정적 인 경우이 도움이 될 수도 있습니다 ,, 은 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 
1

Ex

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); 
    } 
} 
+0

0으로 나누기는 0이 아니지만 오류 여야합니다. –

95

사용 Math.ceil() 및 int로 결과를 캐스팅 :

  • 이 여전히 빠른 피터의 솔루션에 panding, 이것은 내가 '무한대에 가까워'항상 라운드에 나를 위해 작품을 발견 한 것입니다 abs()를 사용하여 복식을 피하는 것보다. 네거티브 작업시 -0.999 0

예 올림되므로

  • 결과는 정확 :

    (int) Math.ceil((double)divident/divisor); 
    
  • +3

    이것은 정답 일 것입니다 – Duane

    +1

    @Duane OP는 "저는 Math.ceil을 사용하여 모아 둘 수있는 옵션이 없었습니다"라고 말했습니다. – Hemmels

    +0

    나는 이것이 지금 "google에 치고있는 최고"수학 라운딩 "이라고 생각합니다. . 그것이 그 위에 조건을 가지고있는 것을 수치스럽게 생각하십시오. – Duane

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

    inbuilt 함수를 사용하는 경우 +1 –

    21

    너무 복잡되지 않은 다른 하나의 라이너

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

    int 대신 long을 사용할 수 있습니다. 매개 변수 유형과 반환 유형을 변경하십시오.

    +2

    이것은 대답이어야합니다. 아마도 구현하는 가장 쉬운 방법 일 것이고 불필요한 단계를 수행하지 않아도됩니다. 또한 다른 숫자 유형으로 변환 할 때 사소한 추가 문제를 피할 수 있습니다. –

    +0

    좋은 해결책. 감사 – ghui

    1

    당신은 B로 나눈 당신이 사용할 수있는 반올림 계산하려면 (A + (- % 나))/(B)

    0

    당신은 아무것도 가져올 수 없습니다하려는 경우,이 제안 :

    int var = message.length()/153; //you can put any integer instead of 153 depend on your case 
    if(message.length() % 153 != 0) 
        var = var + 1; 
    
    8

    구글의 구아바 라이브러리 handles this in the IntMath class : 여기에 많은 답변과는 달리

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

    , 그것은 음수를 처리합니다. 또한 0으로 나누려고 할 때 적절한 예외가 throw됩니다.

    관련 문제