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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top