NSTimeInterval 到可读 NSNumber
-
05-09-2019 - |
题
NSTimeInterval == 双;(例如。169.12345666663)
如何四舍五入这个双精度数,以便“点”后只剩下 2 位数字?
如果结果是一个 NSNumber 那就太好了。
解决方案
如果这是出于显示目的,请查看 NSNumberFormatter.
如果出于某种原因你确实想在计算中四舍五入,你可以使用标准 C round()
功能。
其他提示
NSDecimal 可以四舍五入到指定的位数 NSDecimalRound().
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 C函数round()
可以总是圆使用数字:
double round2dec(double a) { return round(a * 100) / 100; }
但有机会,作为双结果的表示将不具有仅2位小数。
现在,如果使用==迹象,你的意思是,你的两个双数的比较时只到第二位小数。这里是你可以做什么:
fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()