2011-03-23 117 views
1

我在爲存儲float s和double s使用NSUserDefaults在iPhone應用程序中使用,我遇到了一些不一致的地方,它們的精度如何工作,以及我如何理解它的工作原理。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'.  

但是,如果我第一次將雙精度投射到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。通過的值是的兩倍,但轉換爲用於該方法的浮點數。一個簡單的複製和粘貼問題。太糟糕了,Objective-C編譯器並沒有至少拋出類似於其他任何東西的警告......