2011-08-02 2 views
0

내 코드는 모습입니다 :조건문에서 이중 값의 반올림 오류를 방지하는 방법은 무엇입니까? 이 순간

여기
if (!flipped){ 
    scaleX -= 0.1; 
    if (scaleX < 0.0001){ 
     sounds.playSound("flick"); 
     flipped = true; 
    } 
} 

내가 그것을 모양을하고 싶은 것입니다 :

if (!flipped){ 
    scaleX -= 0.1; 
    if (scaleX == 0){ 
     sounds.playSound("flick"); 
     flipped = true; 
    } 
} 

내가 어떻게 이것을 달성 할 수 있습니까? 이중 값 (scaleX가)이 사실은 결코 없기 때문에 0

답변

2

당신은 관용의 어떤 종류를 정의 할은, 다음을 수행하십시오

if (Math.abs(scaleX) < tolerance) 

당신은 값이 정확히 제로가되는 검사해서는 안 - 그냥 "제로에 가깝게". 그건 바이너리 부동 소수점 타입을 가진 삶의 방식입니다 ... "0.1"과 "0.0001"과 같은 것들은 바이너리 부동 소수점으로 정확하게 표현할 수 없습니다. 그래서 당신은 이런 종류의 일을합니다.

그것은 분명하지 않다 당신이 당신의 원본 코드를 좋아하지 않는 이유 , 그리고 당신이 두 번째 양식되고 싶은 이유. 절대 값을 취하지 않는 것 외에도 첫 번째 코드는 나에게 괜찮아 보입니다. (상수를 추출 할 수는 있지만 별도의 문제입니다.)

+0

감사합니다. Jon, 나는 방금 전에 그런 식으로 코딩하고 나중에 다시 생각할 생각으로 주위에 좋은 방법이있을 것이라고 생각했습니다. 그리고 나는 여기있다. :)하지만 고마워, 나는 상수를 추출하고 "충분히 가깝다"라는 접근 방식을 고수 할 것이다. – rtheunissen

1

부동 소수점 연산은 이진수를 나타 내기 위해 2^64 개의 이중 값만있는 경우 정확한 결과를 생성 할 수 없으므로 숫자의.

1

부동 소수점 산술을 사용하는 경우 개념적으로 같음보다는 "매우 가깝게"를 작성하는 것이 일반적입니다.

if (x - y < verySmallValue) 

보다는

if (x == y) 

당신의 y를 0, 그래서 당신은 내가 개념 좋은 생각

if (x < verySmallValue) 

을 쓰고있다.

0

변수의 사용법에 따라 BigDecimal 클래스를 사용할 수 있습니다.

관련 문제