2013-02-04 3 views
3

내 코드에서 반올림 또는 지수 계산없이 db에 삽입하고 싶습니다. 그러나 sop을 2.631578947368421E-7로 사용하면 변환됩니다.BigDecimal 반올림 ..하지만 반올림 싶지 않아

내가 어떤 계산을 원하기 때문에 그대로

BigDecimal a =new BigDecimal(0.0000002631578947368421052631578947368421052632,MathContext.DECIMAL64); 
System.out.println(a); 

가 난 그냥 유지 보수 할 :

다음은 내가 사용하는 코드입니다.

제게 적절한 해결책을 제공해주십시오.

+1

VM이 원시 상수 값으로 해석하려고하는 바로 그 순간부터 반올림 될 수 있습니다. 그것을 '문자열'로 전달하려고 했습니까? –

+2

관심 분야에서 40 자리의 정확도가 필요한 계산은 무엇입니까? –

+0

@ lawrey.. 우리의 응용 프로그램에서 우리의 지불 계산 중 하나가 잘못 낮은 값이 발생하면 보고서를 생성하는 중 ... 그래서이 문제를 해결하기 위해 과학 표기법으로 전환을 제거 생각. – ashwinsakthi

답변

8

큰 십진수 using a String을 만듭니다. 그렇지 않으면 입력 한 상수가 BigDecimal의 생성자에 인수로 전달되기 전에 반올림됩니다.

그래서 이런 걸 쓰기 :

BigDecimal a =new BigDecimal("0.0000002631578947368421052631578947368421052632"); 
System.out.println(a.toPlainString()); 

을 그리고 모든 작업을해야합니다.

편집 : A MathContext object with a precision setting matching the IEEE 754R Decimal64 format, 16 digits, and a rounding mode of HALF_EVEN, the IEEE 754R default.

EDIT2 : 당신은 또한 static MathContext.DECIMAL64 수단으로 생성자의 두 번째 인수를 제거해야 과학적 표기법을 사용하지에 인쇄 할 때 또한 a.toPlainString()를 사용합니다.

+0

BigDecimal a = 새로운 BigDecimal ("0.0000002631578947368421052631578947368421052632", MathContext.DECIMAL64); System.out.println (a); 2.631578947368421E-7 – ashwinsakthi

+0

인쇄 중입니다! – ashwinsakthi

+0

@ashwinsakthi 죄송합니다. 생성자의 두 번째 인수를 없앱니다. 내 대답의 편집을보고 코드를 수정했습니다. –

0

MathContext.UNLIMITED를 사용할 수 있습니다. 당신이 가치를 인쇄 할 때

BigDecimal a =new BigDecimal(0.0000002631578947368421052631578947368421052632,MathContext.UNLIMITED); 
System.out.println(a); 
System.out.println(a.toPlainString()); 

당신은 "지수 필드없이,이 BigDecimal의 캐릭터 라인 표현을"반환 BigDecimal.toPlainString()를 사용할 수 있습니다.

+0

문제를 해결하지 못합니다. 이 값은 소수점 이하 22 자리를 넘었습니다. – EJP

1

BIgDecimal 라운딩.

아니요. BigDecimal은 아무 관련이 없습니다. 상수 값 0.0000002631578947368421052631578947368421052632이 반올림됩니다. 부동 소수점으로 정확하게 표현할 수 없습니다.이 값을 가지는 정확한 BigDecimal을 원하면 new BigDecimal(String).