0

我可以使用一些帮助。经过几天令人沮丧的试验和错误,我得到不一致的结果,将首选项写入 NSUserDefaults。

以下是连续的代码行:

        NSLog(@"startTimer(): End Time defaults: %f\n", [defaults floatForKey:kEndTimeKey]);
    NSLog(@"startTimer(): new End Time: %f\n", endTime);
    [defaults setFloat:endTime forKey:kEndTimeKey];
    [defaults synchronize];
    NSLog(@"startTimer(): stored EndTimeKey: %f\n", [defaults floatForKey:kEndTimeKey]);

kEndTimeKey 是一个常量字符串。

如您所见,我记录了键的当前值,然后记录了我打算存储的值,同步,然后重新读取存储的值。对我来说似乎很简单,但这是调试器输出:

2009-07-22 22:05:43.263 TimerTest3[1584:207] startTimer(): End Time defaults: 0.000000
2009-07-22 22:05:43.266 TimerTest3[1584:207] startTimer(): new End Time: 270018630.916571
2009-07-22 22:05:43.287 TimerTest3[1584:207] startTimer(): stored EndTimeKey: 270018624.000000

我看到原始值 0,以 571 结尾的预期值,以及从缓存中读取的值,该值延迟了 6 秒。

我不确定新的默认值来自哪里。有任何想法吗?我在设备和模拟器上得到了类似的行为。

谢谢布拉德

4

1 回答 1

1

你如何设置结束时间。是双份吗?我比较确定这不是 NSUserDefaults 问题,而是浮点数学问题。

270018630.916571 是 16 位十进制数字,它占用约 48 位数据来存储尾数。浮点数是 32 位,但其中 1 位是符号位、8 位指数和 23 位尾数。这意味着您看到的值远大于浮点数可以容纳的值,并且预计会丢失一些精度。即使你将它截断为 270018630,它仍然需要大约 28 位的精度来表示,这意味着它必须以大于整数的增量四舍五入。

浮点数不会让您神奇地表达比具有相同位数的整数更大的数字。他们通过改变数字之间的差距并使用元数据(指数)来跟踪它,从而创造了存储大量数字的能力。维基百科对它们的工作方式有很好的解释

于 2009-07-23T08:03:38.207 回答