2012-07-27 24 views
0

我已经解决了本文中描述的问题,但想了解它的原因(我花了大量时间弄清楚),因为我已经在下面的“问题”中提出。UIStepper值 - 经过多次迭代后返回的垃圾值

当使用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返回预期的0.0 changeValue我如果测试也不管迭代次数的预期方法的工作。

问题:1)我得到这个,但为什么如果stepValue是一个double值,赋值需要明确包含“f”,对我更加好奇2)为什么我的方法测试没有“f”当它分配viewStepper.stepValue属性时两个步迭代,但返回垃圾的changeValue当我做三个迭代,然后返回到0.0?

下面是该方法的核心我测试:

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

回答

2

听起来像浮点舍入误差的一个典型例子。一般规则是不要比较浮点值是否相等(==)。在第二种情况下,您提高了数字的精确度(至double而不是默认的单精度float),因此您价值的完整性延续了一些计算。如果您确实需要跟踪细粒度的精确十进制值,执行下列操作之一:

  • 使用Decimal数据类型
  • 跟踪标的增量的整数类型,但目前作为一个小数。在你的例子中,如果你的步长总是0.1,那么你可以跟踪的步数作为一个整数,但将步数除以10得到当前的有用值。
+0

了解。谢谢。 – larick 2012-07-27 19:55:47