2015-01-21 2 views
0

반올림을 사용할 때 bigdecimal에서 다른 생성자를 사용하는 것의 차이점은 무엇입니까? 아래의 코드를 실행하는 경우 :BigDecimal 문자열과 (int, long, double) 생성자를 사용한 반올림 차이

public class RoundTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) {//2.425 
     BigDecimal intv = new BigDecimal(4.645); 
     BigDecimal doublev = new BigDecimal(4.645); 
     BigDecimal strV = new BigDecimal("4.645"); 
     BigDecimal longV = new BigDecimal(4.645); 

     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_EVEN)); 
    } 
} 

출력은 다음과 같습니다

Int - 4.64 
Int - 4.64 
Int - 4.64 
Double -4.64 
Double -4.64 
Double -4.64 
**String - 4.65** 
String - 4.64 
String - 4.64 
Long - 4.64 
Long - 4.64 
Long - 4.64 

이유는 문자열 생성자가 다른 사람과는 다른 결과를 제공하여 반올림는 무엇입니까? BigDecimal로 반올림을 사용할 때 더 많은 차이점이 있습니까?

+0

'intv'와'longv'가있는 이유는 명확하지 않습니다. 모든 경우에'BigDecimal (double)'생성자를 호출하기 때문에'doublev'와 정확히 같습니다. –

답변

3

문자열 생성자를 사용하여 반올림 한 결과가 다른 결과와 다른 이유는 무엇입니까?

실제로 일 때만 정확히의 값을 전달하므로이 값이 정확히 4.645입니다. 나머지 시간은 double 값이 지나면 4.645가 닫히고 이 아니고 실제로는 4.645 -이 값은 4.6449999999999573674358543939888477325439453125입니다. 당신이 String와 동일한 결과를 얻을 것 다음 -

당신은 효과적으로 대신 double 값의 표준적인 캐릭터 라인 표현을 구문 분석하는 BigDecimal 가치를 창출 BigDecimal.valueOf(double)를 사용할 수 있습니다.