2017-11-13 18 views
1

BigDecimal 값의 정밀도를 new BigDecimal(12.99).setScale(2, BigDecimal.ROUND_HALF_EVEN으로 지정하려고합니다. 그러나 컴파일러에서 setScale(int, int)이 사용되지 않습니다.BigDecimal.setScale (int, int) 및 RoundingMode 열거 형에 대해 향후 제공되지 않을 생성자

RoundingMode 열거 형을 사용하려고하면 열거 형이 초기화되지 않았을 수 있습니다. 열거 형을 올바르게 사용하여 setScale(int, RoundingMode)으로 BigDecimal을 인스턴스화하는 방법은 무엇입니까?

감사합니다.

+0

편집기로 복사하여 문제를 재현 할 수있는 코드로 실행 가능한 예제를 보여줍니다. –

+0

값이 12.99 인 BigDecimal을 만들고 싶다면'BigDecimal.valueOf (1299, 2)'를 사용하십시오. –

+0

@KlitosKyriacou. 나는 "초기화되지 않은"문제의 원인이되는 코드를 의미했습니다. 그것을 잡아 주셔서 감사합니다. –

답변

3

Java 1.5, 때문에 권장되지 않았습니다

이 새로운 방법보다 새로운 setScale(int, RoundingMode) 메서드를 사용해야합니다.

Java 9에서 마지막으로 사용되지 않았습니다.

대신 setScale(2, RoundingMode.HALF_EVEN)으로 전화하십시오. 정의되지 않은 enum을 전달할 수 없으므로 오류 검사가 훨씬 간단 해지지 만, 확실하게 정의되지 않은 정수 모드로 전달할 수 있습니다.

+0

Java 9에서는 실제로 deprecated *입니다. –

+0

@KlitosKyriacou. 해당 정보로 업데이트되었습니다. –

4

열거 형을 "인스턴스화"하지 말고 상수를 사용해야합니다. 당신은 시도 : 당신은 또한 문자열 생성자 사용할 수

new BigDecimal(12.99).setScale(2, RoundingMode.HALF_EVEN); 

참고 : 열거가 처음 소개되었을 때 워드 프로세서, setScale(int, int)에 따르면

new BigDecimal("12.99"); 
+0

네, 이상적입니다. 건배! – BenjaminJC

2

다른 답변은 반올림 모드에 관한 좋은 지침을 제공하지만 어느 정도는 또 다른 중요한 포인트를 놓치게됩니다. javadoc :

이 생성자의 결과는 다소 예측할 수 없습니다.

요점은 : 당신이 그 다음, 이중 값을 전달 부동 소수점 의미가에 찰 때 즉

:. 당신이 특별한 고가의 "오버 헤드"개체를 사용하려면 임의의 부동 소수점 숫자를 처리합니다. 하지만 당신은 자바 더블 시맨틱 스 (semantic)로 제한된 값을 기반으로 시작한다.

대신 new BigDecimal("12.99") 또는 new BigDecimal(1299, 2)으로 이동하십시오.

+1

좋은 정보이지만 기술적으로 OP가 요구하는 것이 아닙니다. 어쨌든 +1 –

+0

입력 해 주셔서 감사합니다.나는 OP에서 제공 한 코드 예제를 통해 실제 도움이되는 이유를 명확히하기 위해 약간의 답을 다시 찾았다. – GhostCat