3

NSTimeInterval == 双倍;(例如 169.12345666663)

我怎样才能把这个双数四舍五入,以便在“点”之后只剩下 2 位数字?
如果结果是 NSNumber,那就太好了。

4

7 回答 7

6

如果这是出于显示目的,请查看NSNumberFormatter

如果出于某种原因您真的想在计算中舍入双精度数,您可以使用标准 Cround()函数。

于 2009-02-22T23:56:23.783 回答
2

可以使用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];
于 2011-03-24T16:26:28.607 回答
2

如果你真的想在点后留下两位数,乘以 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);
}
于 2011-03-29T12:20:15.257 回答
1

这个HumanReadableTimeInterval 有帮助吗?但是,它返回一个 NSString。或者,您可以通过乘以 100、转换为整数并再次除以 100 来四舍五入。

于 2009-02-22T23:51:02.067 回答
1

在绝大多数情况下,对数字进行四舍五入是您只应在显示时执行的操作。浮点数(双精度或非双精度)的特性使得无法以固定精度存储某些数字。

有关格式化数字以使其显示为小数点后两位的信息,请参阅另一篇文章。

于 2009-02-22T23:55:23.850 回答
0

我只会使用 ANSI Cround()函数。

于 2011-03-28T10:17:40.043 回答
0

您始终可以使用以下方法对数字进行四舍五入:

double round2dec(double a) { return round(a * 100) / 100; }

但很可能结果表示为双精度数不会只有 2 位小数。

现在,如果使用 == 符号,则意味着您的两个双精度数的比较仅对小数点后第二位进行。这是您可以执行的操作:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
于 2011-03-30T10:06:31.137 回答