[英]Objective-C Float / Double precision
我正在使用NSUserDefaults
在iPhone应用程序中使用存储float
和double
,我遇到了一些不一致的精度如何与它们一起工作,以及我如何理解它的工作原理。
这完全像我想的那样工作:
{
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];
}
我假设在最后输入的没有'f'的数字已经被认为是double
s。 这是不正确的? 如果是这样,为什么要投射float
然后double
正常工作?
解决了! 结果我的框架方法+(void)setDouble:(double)value forKey:(NSString*)key
实际定义为+(void)setDouble:(
float
)value forKey:(NSString*)key
。 传递的值是 double,但转换为float以在方法中使用。 一个简单的复制和粘贴问题。 太糟糕了,Objective-C编译器至少没有像其他一切那样发出警告......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.