繁体   English   中英

传递给objective-c中的方法时浮点值更改

[英]float value changes when passed to a method in objective-c

好的,这就是我的情况:

我有一个核心数据生成类Quantity,它的一个属性'Value',标记为float。

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

- (void)setValueValue:(float)value_ {

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

}

现在,当我设置尝试从这样的控制器设置此值,

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

float qv = 100.0f;

[q setValueValue:qv];

该值设置为1.40129846e-43

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

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

关于这里发生了什么的任何线索?

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

特别:

1.40129846e-43 = 100 * 2^-149

更简单地说,如果将整数值100解释为float的编码,那么您正在观察的值就是您所获得的值。

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

因此,调用者将您的100.f值转换为整数100 ,然后由函数将其解释为您正在观察的浮点数的编码。

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

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

除了发生命名冲突的可能性之外,您发布的代码没有任何问题。 动态访问器将具有名称setValue:因此setValueValue:存在混淆运行时的风险。

但是,很可能,您正在查看日志记录错误,即数据很好,您只是错误地显示它。 如果您使用格式错误的NSLog,您将获得非常大的无意义输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM