NSDate和双精度问题

时间:2010-12-16 05:17:47

标签: objective-c nsdate double-precision

这是代码

NSDate* d = [NSDate dateWithTimeIntervalSince1970:32.4560];
double ti = [d timeIntervalSince1970];
NSLog(@"Interval: %f %f %f %f",ti,32.4560,ti*1000.0,32.4560*1000.0);

输出

  

间隔时间:32.456000 32.456000 32455.999970 32456.000000

为什么NSDate会返回丢失一些精度的值?

1 个答案:

答案 0 :(得分:7)

这不是NSDate本身的问题。这是浮点数本身的本质。我相信NSDate的日期与OS X时代(2001年)不同,而不是UNIX时代(1970年)。让两个时期的差异为x。

然后会发生什么:

NSDate* d = [NSDate dateWithTimeIntervalSince1970:32.4560];
// at this point, d keeps 32.4560 + x
double ti = [d timeIntervalSince1970];
// ti is then (32.4560+x)-x

但是,浮点没有无限精度。因此,+x然后-x会在计算中引入轻微错误。

如需更多信息,请阅读this Wikipedia article.

如果您使用OS X时代,您会得到您天真的期望:

NSDate* d = [NSDate dateWithTimeIntervalSinceReferenceDate:32.4560];
// at this point, d keeps 32.4560 + 0
double ti = [d timeIntervalSinceReferenceDate];
// ti is then (32.4560+0)-0, which is 32.4560 even in the floating point world.