BigDecimal 세트 스케일 및 라운드


140

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

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

6
떨어져 아래 허용 답변에서 - 인 setScale는 ()의 BigDecimal의 새로운 객체를 생성 - 그 불변의 클래스 주어진
prash

9
@prash round메소드는 인스턴스가 변경 불가능하기 때문에 BigDecimal의 새 인스턴스도 반환합니다.
daiscog

답변:


212

언급되지는 않았지만 직접적으로 언급되지 않은 중요한 점은 "정밀도""규모" 의 차이점 과 이들이 두 진술에서 어떻게 사용되는지입니다. "정밀도" 는 숫자의 총 유효 자릿수입니다. "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

38
Re : ""정밀도 "는 숫자의 총 자릿수입니다." 아니요. 정밀도는 유효 자릿수입니다. 0.000042M의 정밀도는 2입니다.
David J.

2
"정밀도": 숫자 카운트는 정확한 결과의 가장 왼쪽이 아닌 숫자에서 시작합니다. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

0.0000009의 정밀도가 2가되는 이유보다 "정밀도가 유효 자릿수"인 경우? 1
Sanchi Girotra

1
BigDecimal의 가치는 어떻게 설정됩니까? String.format ()을 사용하여 유효 숫자를 숨길 수있는 값을 어떻게 출력합니까?
dale peters

1
@SanchiGirotra 정밀도는 "비 스케일링 된 값의 자릿수"입니다. 스케일링되지 않은 값이 90이고 스케일이 8 인 정밀도 는 0.0000009입니다. 정밀도 1, 스케일링되지 않은 값 9 및 스케일 7과 마찬가지로
daiscog

52

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.