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
'programing' 카테고리의 다른 글
| Enter 키를 누른 후 onChange 이벤트를 호출하다 (0) | 2023.01.17 | 
|---|---|
| 팬더에서 숫자 열을 찾으려면 어떻게 해야 하나요? (0) | 2023.01.17 | 
| 테스트 러너 'JUnit 4'를 사용하여 테스트를 찾을 수 없습니다. (0) | 2023.01.17 | 
| CodeIgniter 프레임워크를 사용하여 어레이에서 여러 행을 삽입하는 방법 (0) | 2023.01.17 | 
| PHP: stdClass 개체 수 (0) | 2023.01.17 |