将C中的double数据类型转换为Cocoa的NSDecimalNumber数据类型?

5

我正在将我用Java编写的算法转换成Objective-C。 在Java中,BigDecimal类处理基于十进制的数字,并且可以将原始double作为构造函数参数。 但是,在Cocoa的NSDecimalNumber类中,没有直接的方法可以使用原始double构造实例。

目前,我正在使用这个(臭气熏天的)hack:

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

有更好的方法吗?

5个回答

15

NSNumber是NSDecimalNumber的父类,它有一个+numberWithDouble:方法,这正是您需要的。


哇,我怎么错过了那个。谢谢。 - Mike Reedell
1
NSDecimalNumber numberWithDouble 是与 NSNumber numberWithDouble 相同的方法。它将返回 NSNumbers 而不是 NSDecimalNumbers(请参见我关于此的其他评论)。 - Danny Tuppeny
3
我刚刚测试了一下,似乎你是错误的。我执行了 [[NSDecimalNumber numberWithDouble:12.7] class] 并返回了 NSDecimalNumber。你在其他评论中提到的错误是 Cocoa 中的静态类型错误,据我所知,动态类型是好的并且正常工作。numberWithDouble: 只存在于 NSNumber 上这个事实是不相关的,因为它只调用 [[[self alloc] initWithDouble:double] autorelease],而 self 是接收消息的任何类。这是基本继承 — 类可以继承其父类的便利构造函数。 - Chuck
1
顺便提一下,对于任何感兴趣的人,Cocoa-Dev邮件列表曾经讨论过Danny提出的问题。基本上,这只是不同工程师在头文件中使用不同风格而没有预见到后果。NSNumber方便构造函数的静态类型风格提供了更多的静态类型保护(显然),但在与子类一起使用时会导致类似这样的错误,因此大多数类返回id - Chuck
谢谢提供信息。之前我花了很长时间才搞清楚发生了什么(我是从C#转到Objective-C,相对来说还比较新)。这是以后需要注意的事情! - Danny Tuppeny
这样做可能突然不再起作用。由于返回类型仍然固定为(NSNumber *),而不是id或instancetype,因此随着iOS的升级,它可能不再起作用,导致您的应用程序崩溃。 - Saren Inden

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

3
[NSDecimalNumber numberWithDouble:myDouble]

2

我已经找到了让这个工作的方法,而忽略警告的方式是这样的。

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

这样做虽然需要两行代码,但可以消除警告。


0
在其他帖子中,我发现使用NSNumber方法与NSDecimalNumber一起使用,可能会返回NSNumber,或者会返回NSDecimalNumber,但规范并不是这样说的,因此这可能被认为是一个错误,并且将来可能会更改。嗯,就是这样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接