Objective c 使用NSDate函数的舍入错误

Objective c 使用NSDate函数的舍入错误,objective-c,nsdate,Objective C,Nsdate,考虑以下代码: int64_t seconds = 9223372036854775; NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:seconds]; NSTimeInterval intervalInSeconds = [date timeIntervalSince1970]; 间隔秒包含9223372036854776,增加1秒 这是已知的行为吗?如何避免它?-initWithTimeIntervals 1970

考虑以下代码:

int64_t seconds = 9223372036854775;
NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:seconds];
NSTimeInterval intervalInSeconds = [date timeIntervalSince1970];
间隔秒包含9223372036854776,增加1秒


这是已知的行为吗?如何避免它?

-initWithTimeIntervals 1970:
接受类型为
NSTimeInterval
的参数(这是双精度
的typedef)并传递一个
int64_t
,该参数在用于NSTimeInterval参数时隐式转换为双精度

当我尝试将变量重新定义为NSTimeInterval时:

NSTimeInterval seconds = 9223372036854775.0;
结果与您得到的结果相同:

Printing description of seconds: 
(NSTimeInterval) seconds = 9223372036854776
所以这不是NSDate的问题,它是
int64\t
double
之间的转换

NSTimeInterval seconds = 9223372036854775;
NSLog(@"%f", seconds);
印刷品:

9223372036854776.000000

因此,它与
NSDate
无关,而是一个浮点舍入错误(如果指定浮点文本
9223372036854775.0
,则得到相同的结果);如果将
seconds
更改为
NSTimeInterval
,则在用于创建
NSDate
对象之前,它会被舍入。这不是转换问题,因为如果指定浮点文字,也会发生转换问题;这是一个浮点舍入错误。