2012-02-03 2 views
-1

가능한 중복 :
Retain precision with Doubles in java
Floating point inaccuracy examples(배정 밀도/개체 고유성)

나에 관한 좋은 이유가 있다고 알고 객체와 두 배가 Java에 저장되는 방식으로이 if 문을 거짓으로 만듭니다. 내 이해는 어떤 이유로 든, .03 대신 0.29999999입니다. 어떤 사람이 왜이 조건문이 거짓을 반환하는지 더 자세히 설명해 줄 수 있습니까? 자바 (나뿐만 아니라 다른 프로그래밍 언어를 생각한다) 정확한 정밀 floatdouble를 나타내지 않는

public class hello { 
    public static void main(String[] args) { 

     double a = 0.1; 
     double b = 0.1; 
     double c = 0.3; 

     if(a+b+a == c) 
      System.out.println("if is true"); 
    } 
} 
+4

http://docs.oracle.com/cd/E19957-01 /806-3568/ncg_goldberg.html – Mysticial

답변

1

BigDecimal을 사용하여 실제 값을 확인할 수 있습니다.

double a = 0.1; 
double c = 0.3; 

System.out.println(a + " is actually " + new BigDecimal(a)); 
System.out.println(c + " is actually " + new BigDecimal(c)); 
double a3 = a * 3; 
System.out.println("0.1 * 3 or " + a3 + " is actually " + new BigDecimal(a3)); 
double ac = a + c; 
System.out.println("0.1 + 0.3 or " + ac + " is actually " + new BigDecimal(ac)); 

인쇄

0.1 is actually 0.1000000000000000055511151231257827021181583404541015625 
0.3 is actually 0.299999999999999988897769753748434595763683319091796875 
0.1 * 3 or 0.30000000000000004 is actually 0.3000000000000000444089209850062616169452667236328125 
0.1 + 0.3 or 0.4 is actually 0.40000000000000002220446049250313080847263336181640625 

당신이 볼 수 있듯이

, double 정확하게 0.1을 대표 할 수 없다. 0.1 값을 인쇄 할 때 표현 오류를 숨기는 소량의 반올림을 수행합니다. 당신이 un-rounded 계산을 수행하고 표현 오류가 누적 된 것을 볼 수 있다면 예외입니다.

0.1 * 3은 눈에 띄게 큰 오류가 있음을 알 수 있습니다. 그러나 0.1 + 0.3은 0.4와 동일합니다 (이는 0.1에 대한 오차가 약간 크고 0.3에 대한 오차가 너무 작기 때문입니다).