2011-09-19 5 views
0
_screen.brightness = _screen.brightness - 0.1; 

이 코드 줄을 사용하면 예기치 않은 결과가 발생할 수 있습니다.
NSLog(@"%.2f", _screen.brightness - 0.1); 명령을 호출하면
-0.00 값이 인쇄됩니다. 이 if (_screen.brightness == 0)으로 테스트하면 NO이됩니다.
왜 이런 일이 발생합니까? 변환 문제가 있습니까?CGFloat 빼기 문제

여기 _screen의 객체의 클래스 내 접근 방법이다 :

- (CGFloat)brightness { 
    return 1 - _dimmingView.alpha; 
} 

- (void)setBrightness:(CGFloat)brightness { 
    if (brightness < self.minValue || brightness > self.maxValue) { 
     return; 
    } 
    _dimmingView.alpha = 1 - brightness; 
} 
+2

iPhone 프로그래밍으로 졸업 한 적이 있지만 부동 소수점의 부정확성에 대해 결코 알지 못했습니까? Methinks는 아마도 교과서에서 몇 장을 건너 뛰었을 것입니다. –

답변

3

부동 소수점 연산은 반드시 당신에게 당신이 찾고있는 정확한 답변을 제공하지 않습니다. 내가 여기에 설명했던 것보다 나은 사람 : C# float bug? 0.1 - 0.1 = 1.490116E-08. 다른 언어지만 요점은 동일하게 유지됩니다.

+4

... 게시 된 정확한 문제를 해결하려면 0.1 단계로 내려가는 'zero to equal'테스트로 'fabsf (_screen.brightness) <0.05'를 사용하는 것이 좋습니다. – Tommy

+0

나는 이것을 시험해 보려고한다. 고마워요! –