【问题标题】:Convert between a C double and Cocoa's NSDecimalNumber?在 C double 和 Cocoa 的 NSDecimalNumber 之间转换?
【发布时间】:2009-01-04 23:08:49
【问题描述】:

我正在将我用 Java 编写的算法转换为 Objective-C。在 java 中,BigDecimal 类处理基数为 10 的数字,并且可以将原始 double 作为构造函数 arg。然而,在 Cocoa 的 NSDecimalNumber 类中,没有直接的方法可以使用原始双精度来构造实例。

目前我正在使用这个(难闻的)hack:

    [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%1.38f", number]];

有没有更好的办法?

【问题讨论】:

    标签: objective-c cocoa cocoa-touch


    【解决方案1】:

    NSNumber,NSDecimalNumber 的超类,有一个 +numberWithDouble: 方法。这就是你想要的。

    【讨论】:

    • 哇,我怎么会错过这个。谢谢。
    • NSDecimalNumber numberWithDouble 与 NSNumber numberWithDouble 方法相同。它将返回 NSNumbers 而不是 NSDecimalNumbers(请参阅我的其他 cmets)。
    • @Danny Tuppeny:我刚刚对此进行了测试,但您似乎错了。我做了[[NSDecimalNumber numberWithDouble:12.7] class] 并取回了 NSDecimalNumber。您在其他评论中提到的错误是 Cocoa AFAICT 中的静态输入错误。动态类型很好,可以正常工作。 numberWithDouble: 仅存在于 NSNumber 上的事实是无关紧要的,因为它只是调用 [[[self alloc] initWithDouble:double] autorelease],而 self 是接收消息的任何类。这是基本的继承——类可以继承其父类的便利构造函数。
    • 顺便说一下,对于任何感兴趣的人,不久前在 Cocoa-Dev 邮件列表上就 Danny 提出的问题进行了一些讨论。基本上,这只是不同的工程师在他们的标题中使用不同的样式而没有预见到后果。 NSNumber 的便利构造函数的静态类型风格提供了更多的静态类型保护(显然),但在与子类一起使用时会导致类似这样的虚假错误,因此大多数类都返回id
    • 感谢您的信息。我花了很长时间试图弄清楚之前发生了什么(我对 Objective-c 比较陌生,来自 C#)。未来需要注意的事情!
    【解决方案2】:

    你也可以使用[[NSDecimalNumber alloc] initWithDouble:(double)],只是没那么明显。

    【讨论】:

      【解决方案3】:
      [NSDecimalNumber numberWithDouble:myDouble]
      

      【讨论】:

        【解决方案4】:

        我已经找到了让它工作的方法,并且消除警告是这样的。

            NSNumber *temp = [NSNumber numberWithDouble:self.hourlyRate];
            myDecimal = [NSDecimalNumber decimalNumberWithDecimal:[temp decimalValue]]; 
        

        它消除了警告,尽管是两行而不是一行。

        【讨论】:

          【解决方案5】:

          在其他帖子中,我发现使用 NSNumber 方法和 NSDecimalNumber 将返回 NSNumber 或返回 NSDecimalNumber 的信息,但这不是规范所说的,因此它可能被视为未来的错误和变化。呃类似的东西。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-24
            • 1970-01-01
            • 2012-09-03
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多