我将数字转换为纯英文单词,但遇到了一些非常奇怪的情况:NSNumberFormatter
输出的结果奇怪,小于期望的结果,但是将数字作为参数不会引起溢出。
我有以下代码:
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
中获取单词,那么结果就是我期望的结果,即上述字符串。但是,如果我在9
中再添加一个999..
,则会崩溃并显示以下消息:这是Swift Sandbox Test,以使问题更易于理解。
我的实际问题是:假设第一次尝试的输出:
180140398509481984
是对numberFormatter.string(from:)
的某种限制,为什么999999999999999999
不会导致Overflow,而仅显示该限制,而9999999999999999999
(带有额外的9)会导致Overflow ? 最佳答案
9_999_999_999_999_999_999
导致Int
溢出,因为它大于Int64.max
是9_223_372_036_854_775_807
(即0x7fffffffffffffff
)。
关于为什么数字格式化程序将18_014_398_509_481_984
限制在0x40000000000000
(即254,.spelledOut
)上,这似乎可疑地像是源自该值的64位浮点表示的错误。我们无法确定是否不详细了解NSNumberFormatter
和NSNumber
的来源,但我建议这样做是因为,巧合的是,这里的上限恰好是64位浮点类型可以忠实捕获的最大整数值的两倍。
关于ios - NSNumberFormatter.string(来自: ) maximum possible Value exceeded does not result in Overflow - Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42046106/