NSNumberFormatter.string(from: ) 超出最大可能值不会导致溢出 - Swift

NSNumberFormatter.string(from: ) maximum possible Value exceeded does not result in Overflow - Swift

我正在将数字转换为纯英文单词,并且我 运行 遇到了一些非常奇怪的情况:NSNumberFormatter 有一个 st运行ge 输出,比期望的结果小,但是作为参数的数字不会导致溢出。

我有以下代码:

 import Foundation
 var numberFormatter: NumberFormatter = NumberFormatter()
 numberFormatter.numberStyle = .spellOut
 var result: String?
 result = numberFormatter.string(from: 999999999999999999)
 print(result ?? "nil")

并打印 eighteen quadrillion fourteen trillion three hundred ninety-eight billion five hundred nine million four hundred eighty-one thousand nine hundred eighty-four,相当于 18014398509481984< 999999999999999999。如果我尝试从 18014398509481984 中获取单词,结果就是我所期望的,即上述字符串。但是,如果我再添加一个 9999..,它就会崩溃并显示消息:

integer literal 9999999999999999999 overflows when stored into Int

这里有一个Swift Sandbox Test,为了让问题更好理解


我的实际问题是:假设第一次尝试的输出:180140398509481984numberFormatter.string(from:)的某种限制,为什么999999999999999999 不会导致溢出,而​​只会显示该限制,而 9999999999999999999(带有额外的 9)会导致溢出?

9_999_999_999_999_999_999 导致 Int 溢出,因为它大于 Int64.max9_223_372_036_854_775_807(即 0x7fffffffffffffff)。

关于 .spelledOut 的数字格式化程序为何上限为 18_014_398_509_481_984(即 2540x40000000000000),这似乎很可疑就像源自值的 64 位浮点表示的错误。如果不详细查看 NSNumberFormatterNSNumber 的来源,我们无法确定,但我建议这样做是因为巧合的是,这里的上限恰好是 64- 的最大整数值的两倍位浮点类型可以如实捕捉。