正NSDecimalNumber返回意外的64位整数值

Cor*_*ton 10 cocoa foundation ios swift

我无意中发现了一个奇怪的NSDecimalNumber行为:对一些价值观,调用integerValue,longValue,longLongValue,等,返回意外的值.例:

let v = NSDecimalNumber(string: "9.821426272392280061")
v                  // evaluates to 9.821426272392278
v.intValue         // evaluates to 9
v.integerValue     // evaluates to -8
v.longValue        // evaluates to -8
v.longLongValue    // evaluates to -8

let v2 = NSDecimalNumber(string: "9.821426272392280060")
v2                  // evaluates to 9.821426272392278
v2.intValue         // evaluates to 9
v2.integerValue     // evaluates to 9
v2.longValue        // evaluates to 9
v2.longLongValue    // evaluates to 9
Run Code Online (Sandbox Code Playgroud)

这是使用XCode 7.3; 我还没有使用早期版本的框架进行测试.

我已经看到了一些关于意外舍入行为的讨论NSDecimalNumber,以及不使用继承的NSNumber初始化器初始化它的警告,但我还没有看到任何有关此特定行为的信息.然而,一些关于内部表征和四舍五入的相当详细的讨论可能包含我寻求的金块,所以如果我错过它,请提前道歉.

编辑:它已被隐藏在评论中,但我已将此作为问题#25465729提交给Apple.OpenRadar:http://www.openradar.me/radar?id = 5007005597040640 .

编辑2: Apple已将此标记为#19812966的副本.

Ewa*_*lor 0

如果我是你,我会向 Apple 报告错误。文档说NSDecimalNumber可以表示最多 38 位数字的任何值。NSDecimalNumber 从 NSNumber 继承了这些属性,并且文档没有明确说明此时涉及什么转换,但唯一合理的解释是,如果数字可舍入并可表示为 Int,那么您会得到正确的答案。

在我看来,这就像在转换过程中处理符号扩展时的一个错误,因为 intValue 是 32 位,而 integerValue 是 64 位(在 Swift 中)。