为什么Decimal不支持高双打?

时间:2017-08-08 18:53:23

标签: swift3 numbers decimal nsdecimal

let highDouble = 1.7976931348623e+308 // Just under Double.greatestFiniteMagnitude
print(highDouble) // 1.7976931348623e+308
let highDecimal = Decimal(highDouble)
print(highDecimal) // 17976931348623005696000000000000000000000000000000000

这不是我所说的。为清楚起见,如果我把它带回Double

let newHighDouble = Double(exactly: highDecimal as NSNumber)!
print(newHighDouble) // 1.7976931348623e+52

所以308的数量减少到只有52! 这里发生了什么?我认为Decimal可以存储非常大的值,但它似乎甚至不能存储Double可以存储的内容!< / p>

简短摘要:Double(exactly: Decimal(1.7976931348623e+308) as NSNumber)!

1 个答案:

答案 0 :(得分:1)

这里发生了什么?

对我来说,这似乎是Swift标准库的错误。

documentation of Decimal中没有明确说明,但Decimal(在Objective-C中,它是NSDecimal)是NSDecimalNumber和{highDouble的基础{3}}明确指出:

  

实例可以表示可以表示为尾数的任何数字   x 10 ^指数,其中尾数是一个十进制整数,最多38位   long,指数是-128到127 之间的整数。

(添加了大胆的风格。)

因此,您的Decimal无法表示为Decimal.init(_: Double)。在我看来,Decimal.nan应该是一个可用的初始化程序,或者至少它应该返回Decimal(或者某些适当的非数字值,如果有的话),这些数字不能表示为exponent

出现这种情况是因为its documentation将计算出的十进制_exponent设置为内部Decimal(1e256)而未检查其边界。您可以发现1.0000000000000008192返回1.0000000000000008192e052},308-256为{{1}}。

最好向current implementation of Decimal.init(_: Double)Apple发送错误报告。

为什么十进制不支持高双打?

我认为Decimal可以存储非常大的值,但它似乎甚至不能存储Double的内容!

如果这是您主要关注的问题,请参阅Code Different的评论。