2011-03-23 132 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编译器并没有至少抛出类似于其他任何东西的警告......