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


90

다음 결과가 필요합니다

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

.round()또는 .setScale()? 어떻게해야합니까?

답변:


153

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


1
작동하지 않음 : 100.12 : 100.12, 100.44 : 100.44, 100.50 : 100.5, 100.75 : 100.75
Boris Pavlović

3
아니요, 배율을 설정하면 첫 번째와 동일하지 않은 새 소수가 반환됩니다. 예 : BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));false 인쇄
Daniel Fath

6
@Daniel : 그것은 내 대답에 게시 한 코드 스 니펫에 이미 암시되어 있습니다. 나는 지금 그것을 명시 적으로 만들었다.
Grodriguez 2010

RoundingMode그게 뭐야? It 'sBigDecimal
trilogy


10

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

이것은 지금 내 문제를 해결합니다 .. :) 모두 감사합니다.


7
나는 첫 번째 결과가 "내가 원하는 것이 아니다 ..."라는 말이 궁금하다. 실제로 출력 형식화에 관심이있는 경우 DecimalFormat에서와 같이를 사용 new DecimalFormat("###.00")하여 BigDecimal다시 문자열로 의 변환을 관리 할 수 있습니다 . 그것은 제공 "101.00"@Grodriquez 당신의 조각이 만든 두 값의 결과로.
joel.neely 2011

3
두 번째로 반올림하는 것은 이미 정수가 있다는 것을 알고 있으므로 필요하지 않으므로 대신 BigDecimal.ROUND_UNNECESSARY를 사용합니다. 제 생각에는 좀 더 명확합니다.
kosmoplan 2017

5

매우 복잡한 솔루션이 있지만 작동합니다.

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


아니이 솔루션 또는 아무것도를 추천합니다,하지만 input.toBigInteger().toString().length()일부는 훨씬 더 효율적 대수, 어떤 것을 같이 사용하여이 될 것입니다round_up(log(input)) + (1 if input is a power of ten, else 0)
애디슨


0

나는 당신이 단일 명령으로 그렇게 반올림 할 수 있다고 생각하지 않습니다. 시험

    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

나머지 예제를 테스트했으며 원하는 값을 반환하지만 정확성을 보장하지는 않습니다.


-2

원하는

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

2
이것은 아무것도하지 않습니다. 문서에서 round"정밀도 설정이 0이면 반올림이 발생하지 않습니다."
Grodriguez 2010
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.