2017-05-15 2 views
0

BigDecimal 나누기 원인 값이 4 자리 숫자로 잘 맞아야하는 이유는 무엇입니까?BigDecimal 나누기 원인이 유효 숫자 범위 내에서 맞아야하는 이유는 무엇입니까?

BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4)); 
// 1.25 
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4)); 
realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP); 
// 0.01 

내가 메서드 호출에 대한 정밀도를 설정하여 원하는처럼 격차가 동작하도록하는 것이 가능하지만, 이미 그것을하지 않는 이유는 설명하지 않습니다. 명시 적으로 여기 분할 호출에서 반올림 모드를 설정하면

realPercent.divide(percentDivider, 4, BigDecimal.ROUND_HALF_UP) 
// 0.0125 
+0

어떤 언어인지 알려주시겠습니까? BigDecimal 유형이있는 여러 언어가 있습니다. – MSalters

+0

@MSalters aight –

답변

2

을부터 Javadocdivide(BigDecimal, RoundingMode)의 :

반환 값이 (this/divisor)이고, 그 스케일이 BigDecimalthis.scale()

마지막 부분은 중요합니다. 초기 값의 스케일은 2입니다 (스케일되지 않은 값은 125입니다). 눈금을 고정하는 오버로드를 호출했기 때문에 가능한 가장 가까운 결과는 눈금 = 2, 눈금 조정 안됨 = 1, 즉 0.01입니다.

+0

아. 나는'MathContext'가 스케일을 설정한다는 인상을 받았다. 당신이 맞습니다. 만약'realPercent.setScale (4)'에 첫 번째 BigDecimal을 생성 한 후'realPercent.divide (percentDivider, BigDecimal.ROUND_HALF_UP)'를 실행하면 기대했던 크기로 나눕니다. 시원한. –

1

는 :

realPercent = realPercent.divide(percentDivider, BigDecimal.ROUND_HALF_UP); 

당신은 사용 MathContext 우선합니다. 당신이 바로 반올림 모드로 MathContext를 지정하면 예상대로 작동합니다

BigDecimal realPercent = new BigDecimal(1.25, new MathContext(4, RoundingMode.HALF_UP)); 
// 1.25 
BigDecimal percentDivider = new BigDecimal(100, new MathContext(4, RoundingMode.HALF_UP)); 
realPercent = realPercent.divide(percentDivider); 
//0.0125