这是代码
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会返回丢失一些精度的值?
答案 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.