我已经解决了我在本文中所描述的问题,但想要了解它的原因(我花了很多时间来解决这个问题),正如我在下面的“问题”中提出的那样。 / p>
我在使用UIStepper调用IBAction方法时递增和递减返回的值时出现问题。当我运行并调试应用程序时,我可以上下移动,日志语句始终反映了预期的步进器值,但是当我迭代地加速0.1,0.2然后0.3然后下台,当我回来到0.0时,当我执行if测试时,调试器中显示的changeValue值是垃圾,测试没有导致 == 0.0 的真实条件。请注意,如果我只升级到0.2然后回到0.0,则对changeValue的if测试有效。只有当我升到0.3时才能获得垃圾值,当我回到0.0时。
最初,为了增加步进器,我将stepValue属性设置为:
viewStepper.stepvalue = 0.1
并且该方法在步进到0.3并返回到0.0之后将垃圾值返回到0.0。
当我将作业更改为:
viewStepper.stepValue - 0.1f
问题已解决 - changeValue为我的if测试返回了预期的0.0 changeValue,无论迭代次数如何,该方法都按预期工作。
问题:1)我得到了这个,但是为什么如果stepValue是double,分配值需要明确地包含“f”并且对我更好奇2)为什么我的方法中的测试工作没有“ f“当它执行两次步骤迭代时分配viewStepper.stepValue属性,但是当我执行三次迭代然后返回到0.0时,返回了changeValue的垃圾? / p>
以下是我正在测试的方法的核心:
- (IBAction)doStepper:(UIStepper *)sender
{
double changeValue = [sender value];
NSLog(@"(double)change value %f", (double)changeValue);
NSLog(@"sender value:%0.1f", [sender value]);
if ((double)changeValue == 0.0) {
if (!something) {
// do stuff
}
// do stuff
} else {
// do stuff
}
}
答案 0 :(得分:2)
听起来像浮点舍入错误的经典案例。一般规则是不比较等式的浮点值(==
)。在第二种情况下,您提高了数字的精确度(为double
而不是默认的单精度float
),因此您的值的完整性会持续一些计算更长时间。如果您绝对需要跟踪细粒度的精确十进制值,请执行以下操作之一:
Decimal
数据类型