programing

Java Big Decimal:가장 가까운 정수 값으로 반올림

sourcejob 2023. 1. 17. 21:17
반응형

Java Big Decimal:가장 가까운 정수 값으로 반올림

다음과 같은 결과가 필요합니다.

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

.round()또는.setScale()어떻게 해야 하죠?

사용할 수 있습니다.setScale()소수 자릿수를 0으로 줄입니다.가정하다value는 반올림할 값을 보유하고 있습니다.

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);

사용.round()보존할 자리수를 지정해야 하기 때문에, 조금 더 관여하고 있습니다.이 예에서는 3이 됩니다만, 모든 값에 대해 유효한 것은 아닙니다.

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

(주의:BigDecimal오브젝트는 불변한다; 둘 다setScale그리고.round는 새로운 오브젝트를 반환합니다).

그로드리게스의 대답으로 본다면

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

이것은 출력입니다.

100.23 -> 100
100.77 -> 101

그건 내가 원하는게 아니라서 결국 이렇게 된거야

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

이게 내가 얻은 거야

100.23 -> 100.00
100.77 -> 101.00

이것으로 문제가 해결되었습니다. :) 감사합니다.

여기 매우 복잡한 해결책이 있습니다. 하지만 효과가 있습니다.

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}

테스트 코드:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}

출력:

100
100
101
101

다음 사항을 간단히 살펴보기:

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP

또, 다음과 같이 합니다.

setScale(int precision, int roundingMode)

또는 Java 6을 사용하는 경우

http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP

http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html

다음 중 하나를 선택합니다.

setScale(int precision, RoundingMode mode);
round(MathContext mc);

한 번의 명령으로 그렇게 반올림할 수는 없을 것 같아.해라

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

나머지 예제를 테스트해 보니 원하는 값이 반환되지만 정확성은 보장되지 않습니다.

둘 다 아닌 경우.round()도 아니다.setScale()직관적으로 보이므로 이 코드를 사용하여 정수 단계(10초, 25초, 50초, 100초 등)로 반올림할 수 있습니다.

사용방법:

int distance = roundN(_distance, 5);

선언:

public static BigDecimal roundN(BigDecimal num, int precision){
    BigDecimal remainder = num.remainder(BigDecimal.valueOf(precision));
    System.out.println("remainder: " + remainder);

    if (remainder.compareTo(BigDecimal.valueOf((precision / 2))) < 0 ){
        System.out.println("round down");
        return num.subtract(remainder);
    } else {
        BigDecimal neg = remainder.negate().add(BigDecimal.valueOf(precision));
        System.out.println("round up");
        return num.add(neg);
    }
}

후행.00필요에 따라 결과에 추가할 수 있습니다.

너는 원한다

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP

언급URL : https://stackoverflow.com/questions/4134047/java-bigdecimal-round-to-the-nearest-whole-value

반응형