Objective-C Float /双精度

时间:2011-03-23 16:40:52

标签: objective-c precision floating-point-precision

我在使用float存储doubleNSUserDefaults以便在iPhone应用程序中使用时遇到了麻烦,我发现了精度如何与它们协同工作的一些不一致,以及我是如何理解的。

这完全符合我的想法:

{
    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];
}

我假设最后输入的没有'f'的数字已被视为double s。这是不正确的?如果是这样,为什么投射到float然后double正常工作?

1 个答案:

答案 0 :(得分:4)

解决!事实证明,我的框架方法+(void)setDouble:(double)value forKey:(NSString*)key实际上定义为+(void)setDouble:( float )value forKey:(NSString*)key。传递给的值是一个double,但是转换为float以便在方法中使用。一个简单的复制和粘贴问题。太糟糕了,Objective-C编译器至少没有像其他任何事情那样发出警告......

相关问题