2011-03-23 10 views
1

floatdouble을 사용하여 iPhone 응용 프로그램에서 사용하기 위해 NSUserDefaults을 사용하는 것이 었습니다. 정밀도가 어떻게 작용하는지, 그리고 그것이 어떻게 작동하는지 이해하는 방법에있어 약간의 불일치가있었습니다. . 내가 생각으로Objective-C 플로트/배정도

이 정확히 작동합니다

{ 
    NSString *key = @"OneLastKey"; 
    [PPrefs setFloat:235.1f forKey:key]; 
    GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @""); 
    [PPrefs removeObjectForKey:key]; 
} 

을하지만,이 하나가되지 않습니다

{ 
    NSString *key = @"SomeDoubleKey"; 
    [PPrefs setDouble:234.32 forKey:key]; 
    GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @""); 
    [PPrefs removeObjectForKey:key]; 
} 

이 GHUnit 내게주는 출력 :

'234.320007324' should be equal to '234.32'.  

하지만를, 먼저 double을 float으로 캐스팅 한 다음 double으로 만들면 오류없이 작동합니다.

{ 
    NSString *key = @"SomeDoubleKey"; 
    [PPrefs setDouble:234.32 forKey:key]; 
    GHAssertEquals([PPrefs getDoubleForKey:key], (double)(float)234.32, @""); 
    [PPrefs removeObjectForKey:key]; 
} 

나는 번호가 이미 double의 간주 한 끝에 'F'없이 입력한다는 가정하에 있었다. 이것은 틀린가? 그렇다면 float에 캐스팅 한 다음 double에 캐스팅이 제대로 작동하는 이유는 무엇입니까?

답변

4

해결! 실제로 프레임 워크 메서드 +(void)setDouble:(double)value forKey:(NSString*)key+(void)setDouble:(float)value forKey:(NSString*)key으로 정의되었습니다. 의 값은 이었지만이 메서드에서 사용하기 위해 float로 변환되었습니다. 간단한 복사 및 붙여 넣기 문제. Objective-C 컴파일러가 다른 모든 것들을 위해하는 것처럼 경고를 던지지 않는 것은 너무나 안좋은 ...