Objective c UIStepper value—在多次迭代后返回的垃圾值

Objective c UIStepper value—在多次迭代后返回的垃圾值,objective-c,ios,uistepper,Objective C,Ios,Uistepper,我已经解决了我在这篇文章中所描述的问题,但是我想理解为什么会这样(我花了很多时间来解决这个问题),正如我在下面的“问题”中所提出的那样 在使用UIStepper调用iAction方法时,我遇到了一个递增和递减返回值的问题。当我运行和调试应用程序时,我可以上下移动,日志语句总是反映出预期的步进值,但当我迭代地增加0.1、0.2、0.3,然后减少时,当我回到0.0时,当我执行if测试时,调试器中显示的changeValue的值是垃圾,测试没有导致==0.0的真实条件。请注意,如果我只升到0.2,然后

我已经解决了我在这篇文章中所描述的问题,但是我想理解为什么会这样(我花了很多时间来解决这个问题),正如我在下面的“问题”中所提出的那样

在使用UIStepper调用iAction方法时,我遇到了一个递增和递减返回值的问题。当我运行和调试应用程序时,我可以上下移动,日志语句总是反映出预期的步进值,但当我迭代地增加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是双精度的,那么赋值值需要显式地包含“f”并且对我来说更奇怪2)为什么我在方法中的测试在赋值viewStepper.stepValue属性时没有“f”,当它进行了两次步进迭代时,但是当我向上迭代三次,然后返回0.0时,返回了changeValue的垃圾

以下是我测试的方法的核心:

- (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
   }
}

听起来像是一个典型的浮点舍入错误。一般规则是不比较浮点值是否相等(
==
)。在第二种情况下,您将数字的精度提高了一倍(而不是默认的单精度浮点值),因此值的完整性持续了几次计算。如果绝对需要跟踪细粒度的精确十进制值,请执行以下操作之一:

  • 使用
    Decimal
    数据类型
  • 以整数类型跟踪基础增量,但将其表示为十进制。在您的示例中,如果步长始终精确为0.1,则可以将步长数作为整数进行跟踪,但可以将步长数除以10以获得当前有用的值