我在Objective-C中遇到了一个奇怪的问题,即将float转换为NSNumber(为方便起见进行包装),然后再将其转换回float。
简而言之,我的一个类有一个属性“red”,它是从0.0到1.0的浮点数。
奇怪。对吧?这段代码是如何被执行的呢?
文件中实际存储的值:
被转换为
简而言之,我的一个类有一个属性“red”,它是从0.0到1.0的浮点数。
@property (nonatomic, assign) float red;
此对象将自身与从磁盘加载的值进行比较,以实现同步目的。(文件可能在应用程序外部更改,因此定期检查文件更改,将备用版本加载到内存中,并进行比较,合并差异。)
以下是一个有趣的片段,其中比较了这两个值:
if (localObject.red != remoteObject.red) {
NSLog(@"Local red: %f Remote red: %f", localObject.red, remoteObject.red);
}
以下是我在日志中看到的内容:
2011-10-28 21:07:02.356 MyApp[12826:aa63] Local red: 0.205837 Remote red: 0.205837
奇怪。对吧?这段代码是如何被执行的呢?
文件中实际存储的值:
...red="0.205837"...
被转换为
float
使用以下方式:currentObject.red = [[attributeDict valueForKey:@"red"] floatValue];
在代码的另一个位置,我能够从GDB中获取屏幕截图。它被打印到NSLog中,如下所示:(这也是它在磁盘上出现的精度。)
2011-10-28 21:21:19.894 MyApp[13214:1c03] Local red: 0.707199 Remote red: 0.707199
但在调试器中显示为:
这种精度是如何在属性级别上获得的,但没有存储在文件中或在 NSLog 中正确打印?为什么看起来会有所不同?
%+0.16f
而不是%f
。或者您可以使用其他精度代替.16
。如果没有,请忽略此评论。 - chown3.14159
,那么字符串将会是@"3.14159"
(使用"%0.16f"),但如果你使用了"%0.4f",那么它将四舍五入为@"3.1416"
。 - chown