다음 결과가 필요합니다
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
새 객체를 반환합니다.)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
false 인쇄
RoundingMode
그게 뭐야? It 'sBigDecimal
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
이것은 지금 내 문제를 해결합니다 .. :) 모두 감사합니다.
DecimalFormat
에서와 같이를 사용 new DecimalFormat("###.00")
하여 BigDecimal
다시 문자열로 의 변환을 관리 할 수 있습니다 . 그것은 제공 "101.00"
@Grodriquez 당신의 조각이 만든 두 값의 결과로.
매우 복잡한 솔루션이 있지만 작동합니다.
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)
다음을 살펴보십시오.
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
round
"정밀도 설정이 0이면 반올림이 발생하지 않습니다."