0

我已经解决了我在这篇文章中描述的问题,但我想了解它的原因(我花了很多时间来解决这个问题),正如我在下面的“问题”中提出的那样。

在使用 UIStepper 调用 IBAction 方法时,我遇到了递增和递减返回值的问题。当我运行和调试应用程序时,我可以上下调整,日志语句总是反映预期的步进值,但是当我迭代地提高 0.1、0.2 然后 0.3 然后降低时,当我回到 0.0 时,当我执行如果进行测试,则调试器中显示的 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)为什么我在方法中的测试在没有“f”的情况下工作在进行两步迭代时分配 viewStepper.stepValue 属性,但是当我向上进行三步迭代然后返回到 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
   }
}
4

1 回答 1

2

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

  • 使用Decimal数据类型
  • 以整数类型跟踪基础增量,但将其显示为小数。在您的示例中,如果您的步长始终为 0.1,您可以将步数作为整数跟踪,但将步数除以 10 以获得当前有用的值。
于 2012-07-27T19:05:46.237 回答