iphone - 当传递给 Objective-C 中的方法时,浮点值会发生变化

标签 iphone objective-c core-data floating-point

好的,这是我的情况:

我有一个核心数据生成的类 Quantity,其属性之一为“Value”,标记为 float 。

Quantity 类中有一个方便的方法可以帮助我设置此属性:

- (void)setValueValue:(float)value_ {

    [self setValue:[NSNumber numberWithFloat:value_]];

}

现在,当我设置时,尝试从像这样的 Controller 设置这个值,

Quantity *q = (Quantity *) [NSEntityDescription insertNewObjectForEntityForName:@"Quantity" inManagedObjectContext:self.managedObjectContext];

float qv = 100.0f;

[q setValueValue:qv];

该值设置为1.40129846e-43

我在上面的两个位置都放置了断点,虽然工具提示在 Controller 类中正确显示值为 100.0,但在 setter 方法中显示的值不正确。

最终,存储在对象和数据库中的值是不正确的值。

关于这里发生的事情有任何线索吗?

最佳答案

1.40129846e-43 是一个非常有趣的数字,它告诉我们这里发生了什么。

具体:

1.40129846e-43 = 100 * 2^-149

更简单地说,您观察到的值就是将整数值 100 解释为 float 的编码时得到的值。

最有可能发生的情况是您没有包含声明 setValueValue:(float) 方法的 header ,或者该声明不在您所在位置的范围内调用该方法。这会导致编译器假设该方法采用整数参数而不是浮点参数。

因此,调用者将您的 100.f 值转换为整数 100,然后函数将其解释为您所要的 float 的编码观察。

另一种可能性是您的日志记录代码中的某处发生了类似类型的阻抗不匹配。

TLDR:请确保在基于 C 的语言中使用函数之前声明它们。

关于iphone - 当传递给 Objective-C 中的方法时,浮点值会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3488002/

相关文章:

ios - CoreData 测试实体是否为空

php - iphone sdk\Uxxx 到 utf-8

iphone - 是否可以在 iPhone 中创建自定义控件

javascript - 如何在iPhone中以HTML iframe自动播放youTube Video

ios - 这个错误怎么可能 : Unrecognized Selected (screenFontWithRenderingMode) in iOS?

ios - Swift 中的大型 Core Data 批量插入导致内存泄漏

ios - 如何使用 iOS 13 在 iOS 设备中获取 SSID

iphone - 您可以使用 Core Graphics 绘制文本阴影/轮廓吗?

objective-c - 我可以#ifdef#imports 吗?

ios - 有选择地获取核心数据以获得更好的性能(稍后获取大项目)