BigDecimal을 * 항상 * 반올림하는 경우 소수점 이하 두 자리가 있습니다.


217

BigDecimal 값을 소수점 이하 두 자리로 반올림하려고합니다.

나는 사용하고있다

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);

그러나 그것은 내가 원하는 것을 일관되게하지 않습니다.

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.74
rounded 0.819 to 0.82

나는 유효 숫자를 신경 쓰지 않고 소수점 이하 두 자리를 원합니다. BigDecimal로 어떻게해야합니까? 아니면 이것에 더 적합한 다른 클래스 / 라이브러리가 있습니까?


9
실제로 라운드 싶은 경우에, 당신은 RoundingMode.HALF_UP 사용합니다
길버트 르 블랑

답변:


401
value = value.setScale(2, RoundingMode.CEILING)

19
그것은 실제로 내가 원하는 방식으로 작동합니다. 고정 소수점 round()자릿수로 setScale작업하는 동안 유효 숫자로 작동 하는 차이가 단순히 더 많습니까?
Brad Mace

44
"typcal rounding"을 수행하려면 RoundingMode.HALF_UP을 사용하십시오. 1.111은 1.11입니다. [천장에 1.12 제공]
Grzegorz Dev

5
감사합니다 RoundingMode.HALF_UP. 문서에 따르면 학교에서 일반적으로 가르치는 반올림 방법입니다.
silver

1
회계 응용 프로그램에서와 같이 값이 음수 일 수 있는지주의하십시오.
Dale

1
setScale(...)작동합니까? BigDecimal setScale and round를 참조하십시오 .
Jason Law
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.