이런 식으로 반올림하는 Java 함수나 util 클래스가 있습니까?func(3/2) = 2?

StackOverflow https://stackoverflow.com/questions/1074228

  •  21-08-2019
  •  | 
  •  

문제

Java 기능이나 유틸리티가 있습니까? class 이런 식으로 반올림됩니다. func(3/2) = 2

Math.ceil() 도움이 되지 않습니다. 이름으로 그렇게 했어야 했습니다.나는 알고있어 BigDecimal, 하지만 필요하지 않습니다.

도움이 되었습니까?

해결책

Math.ceil() 항상 반올림되지만 정수 나누기를 수행하고 있습니다. 3/2.따라서 정수 나누기에서는 3/2 = 1 (아니다 1.5) 천장 1 ~이다 1.

원하는 결과를 얻기 위해 해야 할 일은 다음과 같습니다. Math.ceil(3/2.0);

두 배의 금액으로 나누면 (2.0), 정수 나누기 대신 부동 소수점 나누기를 수행하게 됩니다.따라서 3/2.0 = 1.5, 그리고 ceil() ~의 1.5 항상 2.

다른 팁

약간의 흑 마법, 당신은 정수로 모든 것을 할 수 있습니다.

// Divide x by n rounding up
int res = (x+n-1)/n

항상 먼저 캐스트 할 수 있습니다.

Math.ceil((double)3/2)

바닥 부서를 천장 부서로 변환하려면 :

(numerator + denominator-1) / denominator

바닥 부서를 반올림 부서로 변환하려면 :

(numerator + (denominator)/2) / denominator

Java에서는 정수 부서를 사용하기 때문에 3/2 = 1입니다. 나중에 이것을 "고정"할 수있는 기능은 없습니다. 당신이해야 할 일은 플로트 분할을 강요하고 결과를 반올림하는 것입니다.

int result = (int)Math.ceil( ((float)3) / ((float)2) );

이것이 정수 부서의 일반적인 사례에 맞지 않습니까? 플로팅 포인트 유형에 숫자를 캐스팅 한 후 Math.ceil을 사용해보십시오.

많은 언어들이 이렇게 "생각"합니다. int를 int로 나누는 경우 int를 가져와야합니다 (따라서 자르고 결과적으로 1을 얻습니다).

우리 모두는 이것이 사실이 아니라는 것을 알고 있지만 그것이 그들이 일하는 방식입니다. 당신은 그들을 "속임수"하고 그중 하나를 두 배로 캐스팅하는 것과 같은 일을하거나 이중 표현을 사용할 수 있습니다. Math.ceil (3.0 / 2) 또는 Math.ceil((double)3/2), 말한 바와 같이.

수학 ~ 할 것이다 부동 소수점 번호를 사용하는 경우 도움말. 문제는 정수 부서의 3/2가 1이라는 것입니다. 값이 모든 기능에 도달 할 때까지 수학 또는 다른 것 일 때까지 값은 단순히 1입니다.

if (a % b == 0)
{
  return (a / b);
}
else
{
  return (a / b) + 1;
}

정수 부서를 이용하여 원하는 것을 수행합니다. 나는 이것을하는 수학 기능을 모르지만 왜 당신 자신을 굴리지 않습니까?

아래 조각은 음의 정수와 함께 작동합니다.

public static int divRoundUp(int x, int n) {
    if (n<=0) throw new RuntimeException("conceived wt. pos. dividers (was:"+n+")");
    int ret = (x+(n-1)*(x>0?1:0))/n;
    return ret;
}

나는 Randy Proctor의 대답이 최고를 좋아합니다. 여기에서 더 자세히 다음과 같습니다.

정수> 0으로 실제 반올림 (예 : 3/2-> 2, 그러나 17 / 7-> 2)을하고 싶다면 사용하십시오. (dividend + (divisor / 2)) / divisor 대신에 dividend / divisor.

배당금이 정수가 될 수있는 경우 (즉, 부정적인 허용) :(dividend >= 0) ? ((dividend + divisor / 2) / divisor) : ((dividend - divisor / 2) / divisor).

배당금이 정수 및 구분 인 경우 정수이지만 0 :(dividend >= 0) ? ((dividend + Math.abs(divisor) / 2) / divisor) : ((dividend - Math.abs(divisor) / 2) / divisor).

(첨가 및 하위 계열은 그렇지 않으면 발생하지 않는 랩 어라운드를 유발하여 결과를 잘못 만듭니다.)

다음은 Math Round를 사용하지 않고 Casting을 플로팅하지 않고 Int Division을 처리하기 위해 만든 방법입니다. 이것은 양수와 음수에 맞습니다. 분모의 절반을 추가하여 반올림을 상쇄하여 작동합니다.

public static int div_Int(int num, int den){
    if(num > 0 && den > 0 || num < 0 && den < 0 ){
        return ((2*num)+ den)/(2*den);  
    }else{
        return ((2*num)- den)/(2*den);
    }

}

2로 나누고 싶다면 다음을 수행 할 수 있습니다.

n - n / 2

그리고 일반적으로 :

(n - 1) / d + 1 == (n + d - 1) / d

이것은 음성이없는 정수를 보유합니다. 음의 정수로 확장하는 방법은 "이런 식으로 반올림하는 것"의 의미에 따라 다릅니다. 정수 부서는 0으로 반올림되는 반면 Math.ceil() 반올림하고 Math.floor() 반올림. 예를 들어 n / 2 != (int) Math.floor(n / 2.0) ~을 위한 n == -5.

항상 반올림하고 싶다면 사용할 수 있습니다. Math.ceil() 에서와 같이 이 답변.

천장과 주조 사용을 실제로 피하고 싶다면 여기에 같은 일을하는 작은 방법이 있습니다.

public int findCeil(int X, int Y) {
        if (X % Y == 0){
            return X / Y;
        } else {
            return X / Y + 1;
        }
    }

당신은 시도 했습니까? Math.floor() ?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top