[java] Java BigDecimal : 가장 가까운 정수로 반올림

다음 결과가 필요합니다

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새 객체를 반환합니다.)


답변

Grodriguez의 대답으로 가면

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(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP


답변