[java] BigDecimal 세트 스케일 및 라운드

이 두 통화의 차이점은 무엇입니까? (있어요?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);



답변

언급되지는 않았지만 직접적으로 언급되지 않은 중요한 점은 “정밀도”“규모” 의 차이점 과 이들이 두 진술에서 어떻게 사용되는지입니다. “정밀도” 는 숫자의 총 유효 자릿수입니다. “scale” 은 소수점 오른쪽의 자릿수입니다.

MathContext 생성자는 정밀도 및 RoundingMode 만 인수로 허용하므로 스케일은 첫 번째 명령문에 지정되지 않습니다.

setScale() 분명히 RoundingMode와 마찬가지로 scale을 인수로 받아들이지 만 두 번째 명령문에는 정밀도가 지정되지 않습니다.

소수점을 한 자리 오른쪽으로 이동하면 차이가 분명해집니다.

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456


답변

실제로 큰 차이가 있습니다. 명심해야합니다. setScale은 실제로 숫자의 스케일을 설정하지만 round는 숫자를 지정된 숫자로 반올림하지만 jdk에서 언급 한 것처럼 “정확한 결과의 가장 왼쪽 숫자부터 시작합니다”. 따라서 샘플과 관련하여 결과는 동일하지만 대신 0.0034를 시도하십시오. 내 블로그에 대한 참고 사항은 다음과 같습니다.

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html


답변