【问题标题】:NSTimeInterval to readable NSNumberNSTimeInterval 到可读的 NSNumber
【发布时间】:2009-02-22 23:48:48
【问题描述】:

NSTimeInterval == 双倍; (例如 169.12345666663)

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

【问题讨论】:

    标签: objective-c cocoa floating-point double rounding


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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];
      

      【讨论】:

        【解决方案3】:

        如果你真的想在点后留下两位数,乘以 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);
        }
        

        【讨论】:

          【解决方案4】:

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

          有关格式化数字以使其显示为两位小数的信息,see this other post

          【讨论】:

            【解决方案5】:

            HumanReadableTimeInterval 有帮助吗?但是,它返回一个 NSString。 或者,您可以将自己乘以 100,转换为整数并再次除以 100。

            【讨论】:

              【解决方案6】:

              我只会使用 ANSI C round() 函数。

              【讨论】:

                【解决方案7】:

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

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

                但是结果表示为 double 的可能性很大,不会只有 2 位小数。

                现在,如果使用 == 符号,您的意思是您的两个双精度数的比较只进行到小数点后第二位。以下是您可以执行的操作:

                fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-19
                  • 1970-01-01
                  • 2014-10-04
                  • 1970-01-01
                  • 2013-08-05
                  相关资源
                  最近更新 更多