2014-01-09 6 views
-9

그래서 간단한 빼기 계산을 엉망으로 만드는 Java 응용 프로그램의 버그를 좁혔습니다. 나는 왜 정확히 알 수 없다. 여기에 약간의 코드가 있습니다 :잘못된 빼기 결과 : 3.999999, 아니요 4

for (double x = (((double)bdl.length())-1)/10; x > 0; x--) { 
      int count; 
      System.out.println("x = " + x); 
      if (x >= 1) { 
       System.out.println("X = " + x + " so count = 20"); 
       count = (20); 
      } else { 
       count = (int)(x*20); 
       System.out.println("X = " + x + " so count = "+count); 
      } 
    } 

변수 bdl은 단지 JSONArray이며,이 점의 길이와 관련이 있습니다. bdl은 처음에 길이가 15이므로 x는 1.4가됩니다. 루프를 처음 훑어 보면 첫 번째 println은 "X = 1.4 so count = 20"이라고 말합니다. 그러나 x = 0.4 일 때 두 번째로 "X = 0.3999999999999999이므로 count = 7"이라고 표시됩니다. 그 시점에서 int로 캐스팅 (x * 20)하면 7을 얻을 수 있지만 내 질문은 왜 x가 0.4가 아닌지 이해합니다.

+16

ObReference : [모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+7

Java를 비난하기 전에 사용할 올바른 유형. –

+1

이것은 부동 소수점 연산 때문입니다. 귀찮아하거나 잘리는 경우 소수점 이하의 특정 숫자로 답을 말아 올릴 수 있습니다. –

답변

0

실제로 'x'는 0.4입니다. 단지 정밀도 문제입니다.
모든 부동 소수점 비교 연산은 특정 정밀도 (일부 구현에서는 델타 또는 엡실론)로 실행해야합니다.

this post을 참조하십시오.

1

double은 부동 소수점 숫자입니다. 이는 사전 검사를위한 것이 아니며, 속도와 정확도가 아닌 것을 의미합니다. 그래서 그 대신,이 같은 int를 사용한다 :

for (int x = ((bdl.length())-1)/10; x > 0; x--) { 

이 정확한 당신의 번호를 유지합니다.