UIStepper值 - 经过多次迭代后返回的垃圾值

时间:2012-07-27 18:55:56

标签: objective-c ios uistepper

我已经解决了我在本文中所描述的问题,但想要了解它的原因(我花了很多时间来解决这个问题),正如我在下面的“问题”中提出的那样。 / 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
   }
}

1 个答案:

答案 0 :(得分:2)

听起来像浮点舍入错误的经典案例。一般规则是不比较等式的浮点值(==)。在第二种情况下,您提高了数字的精确度(为double而不是默认的单精度float),因此您的值的完整性会持续一些计算更长时间。如果您绝对需要跟踪细粒度的精确十进制值,请执行以下操作之一:

  • 使用Decimal数据类型
  • 跟踪整数类型中的基础增量,但将其显示为小数。在您的示例中,如果您的步骤始终为0.1,则可以将步数跟踪为整数,但将步数除以10以获得当前有用值。