NSTimeInterval == 双倍;(例如 169.12345666663)
我怎样才能把这个双数四舍五入,以便在“点”之后只剩下 2 位数字?
如果结果是 NSNumber,那就太好了。
NSTimeInterval == 双倍;(例如 169.12345666663)
我怎样才能把这个双数四舍五入,以便在“点”之后只剩下 2 位数字?
如果结果是 NSNumber,那就太好了。
如果这是出于显示目的,请查看NSNumberFormatter。
如果出于某种原因您真的想在计算中舍入双精度数,您可以使用标准 Cround()
函数。
可以使用NSDecimalRound()将 NSDecimal 舍入到指定的位数。
double d = [[NSDate date] timeIntervalSince1970];
NSDecimal in = [[NSNumber numberWithDouble:d] decimalValue];
NSDecimal out;
NSDecimalRound( &out, &in, 2, NSRoundUp );
NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];
如果你真的想在点后留下两位数,乘以 100,使用 round() 函数将其四舍五入,再除以 100。但是,这并不能保证它在点之后真的只有两位数,因为通过再次划分它,您可能会得到一个无法真正用浮点表示法表达的数字,而当您期望 0.1 时,您实际上可能会得到 0.09999.. .,那是因为你不能用浮点表示法真正表达 0.1。
如果您只想在点后将其四舍五入为两位数以进行显示,则可以按照建议使用 NSNumberFormatter 或仅使用:
printf("%.2f\n", yourTimeInterval);
NSLog(@"%.2f\n", yourTimeInterval);
或者要获得 NSString,您还可以使用以下内容,这可能比使用 NumberFormatter 更快(但是,它不会根据用户偏好进行本地化):
NSString * intervalStr = nil;
char * intervalStrTmp = NULL;
asprintf(&intervalStrTmp, "%.2f", yourTimeInteval);
if (intervalStrTmp) {
intervalStr = [[NSString alloc] initWithUTF8String:intervalStrTmp];
free(intervalStrTmp);
}
这个HumanReadableTimeInterval 有帮助吗?但是,它返回一个 NSString。或者,您可以通过乘以 100、转换为整数并再次除以 100 来四舍五入。
在绝大多数情况下,对数字进行四舍五入是您只应在显示时执行的操作。浮点数(双精度或非双精度)的特性使得无法以固定精度存储某些数字。
有关格式化数字以使其显示为小数点后两位的信息,请参阅另一篇文章。
我只会使用 ANSI Cround()
函数。
您始终可以使用以下方法对数字进行四舍五入:
double round2dec(double a) { return round(a * 100) / 100; }
但很可能结果表示为双精度数不会只有 2 位小数。
现在,如果使用 == 符号,则意味着您的两个双精度数的比较仅对小数点后第二位进行。这是您可以执行的操作:
fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()