2009-05-29 4 views
23

이 코드는 때때로 1E + 1을 반환하지만 다른 입력 (예 : 17)의 경우 출력은 과학 표기법으로 인쇄되지 않습니다.Java BigDecimal이 1E + 1을 반환하는 이유는 무엇입니까?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros(); 
System.out.println("value: " + bigDecimal); 

답변

39

사용 bigDecimal.toPlainString() :

BigDecimal bigDecimal = BigDecimal.valueOf(100000.0) 
        .multiply(BigDecimal.valueOf(100d)) 
        .stripTrailingZeros(); 
System.out.println("plain  : " + bigDecimal.toPlainString()); 
System.out.println("scientific : " + bigDecimal.toEngineeringString()); 

출력 :

 
plain  : 10000000 
scientific : 10E+6 
+0

+1 대신 실제 솔루션을 제공했는데 "여기가 문제입니다"라고 말했습니다. :) –

+0

이 같은 대답은 Stackoverflow를 훌륭하게 만드는 것입니다. –

7

그것은 당신이 System.out.println()에 결과를 통과 할 때 일어나는 암시 .toString() 변환합니다.

+0

+1 문제를 가리 키기 위해 – dfa

3

BigDecimal.toString()의 동작에 대한 정확한 근거 큰 (근처 이해할) API doc 상세히 설명한다.

일관된 (그리고 로케일 구분) 텍스트 표현을 얻으려면 DecimalFormat을 사용해야합니다.

3

기본적으로 유효 자릿수가 충분하지 않기 때문입니다. 1 개의 유효 숫자 만 100으로 곱하면 그 자리에 1 개의 유효 숫자 만있는 무언가가 생깁니다. "10"을 표시하면 기본적으로 2 자리 유효 숫자가 표시됩니다. 그것을 표시하는 방법은 "1 x 10^1"을 표시하는 것입니다.

다음 두 소수

동일한 값 (10) 만, 다른 "스케일"이 (가 유효 숫자를 카운트 시작 상기 상위 2 시그마도 있고, 하단이 1을 갖는)

System.out.println(new BigDecimal(BigInteger.TEN, 0)); // prints 10 
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1 
관련 문제