【发布时间】:2009-02-22 23:48:48
【问题描述】:
NSTimeInterval == 双倍; (例如 169.12345666663)
我怎样才能将这个双数四舍五入,以便在“点”之后只剩下 2 位数字?
如果结果是 NSNumber 那就太好了。
【问题讨论】:
标签: objective-c cocoa floating-point double rounding
NSTimeInterval == 双倍; (例如 169.12345666663)
我怎样才能将这个双数四舍五入,以便在“点”之后只剩下 2 位数字?
如果结果是 NSNumber 那就太好了。
【问题讨论】:
标签: objective-c cocoa floating-point double rounding
如果这是出于展示目的,请查看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);
}
【讨论】:
在绝大多数情况下,您只应在显示时进行四舍五入。浮点数(双精度或非双精度)的特性使得以固定精度存储某些数字是不可能的。
有关格式化数字以使其显示为两位小数的信息,see this other post。
【讨论】:
HumanReadableTimeInterval 有帮助吗?但是,它返回一个 NSString。 或者,您可以将自己乘以 100,转换为整数并再次除以 100。
【讨论】:
我只会使用 ANSI C round() 函数。
【讨论】:
您始终可以使用以下方法对数字进行四舍五入:
double round2dec(double a) { return round(a * 100) / 100; }
但是结果表示为 double 的可能性很大,不会只有 2 位小数。
现在,如果使用 == 符号,您的意思是您的两个双精度数的比较只进行到小数点后第二位。以下是您可以执行的操作:
fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
【讨论】: