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)!
答案 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.0000000000000008192e0
(52
},308-256
为{{1}}。
最好向current implementation of Decimal.init(_: Double)
或Apple发送错误报告。
为什么十进制不支持高双打?
我认为Decimal可以存储非常大的值,但它似乎甚至不能存储Double的内容!
如果这是您主要关注的问题,请参阅Code Different的评论。