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
中获取单词,结果就是我所期望的,即上述字符串。但是,如果我再添加一个 9
到 999..
,它就会崩溃并显示消息:
integer literal 9999999999999999999
overflows when stored into Int
这里有一个Swift Sandbox Test,为了让问题更好理解。
我的实际问题是:假设第一次尝试的输出:180140398509481984
是numberFormatter.string(from:)
的某种限制,为什么999999999999999999
不会导致溢出,而只会显示该限制,而 9999999999999999999
(带有额外的 9)会导致溢出?
9_999_999_999_999_999_999
导致 Int
溢出,因为它大于 Int64.max
是 9_223_372_036_854_775_807
(即 0x7fffffffffffffff
)。
关于 .spelledOut
的数字格式化程序为何上限为 18_014_398_509_481_984
(即 254、0x40000000000000
),这似乎很可疑就像源自值的 64 位浮点表示的错误。如果不详细查看 NSNumberFormatter
和 NSNumber
的来源,我们无法确定,但我建议这样做是因为巧合的是,这里的上限恰好是 64- 的最大整数值的两倍位浮点类型可以如实捕捉。
我正在将数字转换为纯英文单词,并且我 运行 遇到了一些非常奇怪的情况: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
中获取单词,结果就是我所期望的,即上述字符串。但是,如果我再添加一个 9
到 999..
,它就会崩溃并显示消息:
integer literal
9999999999999999999
overflows when stored intoInt
这里有一个Swift Sandbox Test,为了让问题更好理解。
我的实际问题是:假设第一次尝试的输出:180140398509481984
是numberFormatter.string(from:)
的某种限制,为什么999999999999999999
不会导致溢出,而只会显示该限制,而 9999999999999999999
(带有额外的 9)会导致溢出?
9_999_999_999_999_999_999
导致 Int
溢出,因为它大于 Int64.max
是 9_223_372_036_854_775_807
(即 0x7fffffffffffffff
)。
关于 .spelledOut
的数字格式化程序为何上限为 18_014_398_509_481_984
(即 254、0x40000000000000
),这似乎很可疑就像源自值的 64 位浮点表示的错误。如果不详细查看 NSNumberFormatter
和 NSNumber
的来源,我们无法确定,但我建议这样做是因为巧合的是,这里的上限恰好是 64- 的最大整数值的两倍位浮点类型可以如实捕捉。