2013-01-09 1 views
0

나는 두 개의 BigDecimals, value1value2을 가지고 있습니다. 나는 value1value2으로 나누고 싶지만, 그 중 하나가 0이면 분명히하고 싶지 않습니다. 그래서 나는이 간단한 if 문 작성이 if 문이 작동하지 않았다 몇 가지 이유 .. 들어BigDecimal if 문이 작동하지 않습니다! 운영자?

if(!value1.equals(0) && !value2.equals(0)){ 
    divide value1 by value2 blah blah blah 
} 

을 심지어 값 중 하나가 방정식은 아직도 내가 분할하려고했기 때문에 나에게 오류를주는 평가 될 것 제로를 같게 할 때 0과 함께 또는 0으로. 나는 단지 value1.compareTo(BigDecimal.valueOf(0) == 1을 사용할 수 있고 내가하고 싶은 것을 얻는다는 것을 안다. 그러나 나는 왜 내 첫 번째 방법이 효과가 없었던 지 궁금하다.

+0

value1/value2를 수행 할 때 value2가 0인지 아닌지를 확인하고 value1이 0이면 결과가 0이어야합니다. – Srinivas

+1

사용하는 메소드의 javadoc에서 : "지정된 객체 **가 값과 스케일이이 BigDecimal의 것과 동일한 BigDecimal 인 경우에만 true입니다." 메서드에서 예기치 않은 결과가 발생하면 해당 메서드를 확인하십시오. –

+0

나중에 참조 할 수 있도록 항상 [SSCCE] (http://sscce.org)를 제공하십시오. 상당히 단순한'if' 조건에는 ** 2 ** 구문 오류가 있습니다. – jlordo

답변

5

Java는 다른 유형의 객체를 다르게 취급합니다. 이것은 그들이 동일인을 대표한다고해도 그들이 동일하지 않다는 것을 의미합니다. BigDecimal의이 유형은 동일하며 값이 equivelent 있지만 다른 비늘 경우에도, 그들은 여전히 ​​아니라는 것이다 대해 "특별한"무엇

Double d = 0.0; 
Integer i = 0; 
System.out.println(d + " equals " + i + " is " + (d.equals(i))); 

BigDecimal bd2 = new BigDecimal("0.00"); 
BigDecimal bd3 = new BigDecimal("0.000"); 

System.out.println(bd2 + " equals " + d + " is " + (bd2.equals(d))); 
System.out.println(bd2 + " equals " + bd2 + " is " + (bd2.equals(bd2))); 
System.out.println(bd2 + " equals " + bd3 + " is " + (bd2.equals(bd3))); 

인쇄

0.0 equals 0 is false 
0.00 equals 0.0 is false 
0.00 equals 0.00 is true 
0.00 equals 0.000 is false 
"동일"

이 방법은 compareTo를 사용하여 눈금을 조정하고 더 자연스러운 비교를 제공합니다. 당신의 BigDecimal을 사용하려는 경우 의미

System.out.println(bd2 + " compareTo " + BigDecimal.ZERO + " is " + (bd2.compareTo(BigDecimal.ZERO))); 
System.out.println(bd3 + " compareTo " + BigDecimal.ZERO + " is " + (bd3.compareTo(BigDecimal.ZERO))); 

인쇄

0.00 compareTo 0 is 0 
0.000 compareTo 0 is 0 

당신은 내가 더 간단하고 빠른 double를 사용하는 것을 선호, 개인적으로

if(value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) { 

를 작성해야합니다. 유일한 단점은 반올림을 직접 관리해야한다는 것입니다.

double div = value1/value2; 
if (0 < div && div < SOME_UPPER_SENSIBLE_LIMIT) { 
    // division was ok. 
    System.out.printf("%.4f", div); // print with rounding. 
0

대신이 값을 사용하십시오.

if(BigDecimal.ZERO.compareTo(value1) != 0 && BigDecimal.ZERO.compareTo(value2) != 0) 
    { 
    .... 
    } 

equals은 작동하지 않습니다.

다음을 확인하십시오. public boolean equals(Object x) 이 BigDecimal과 지정된 Object가 동일한 지 비교하십시오. compareTo와는 달라,이 메소드는 값과 스케일이 동일한 경우에만 2 개의 BigDecimal 객체가 동일하다고 간주합니다 (따라서이 메서드로 비교했을 때 2.0은 2.00과 같지 않음).