我将数字转换为纯英文单词,但遇到了一些非常奇怪的情况: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.max9_223_372_036_854_775_807(即0x7fffffffffffffff)。

关于为什么数字格式化程序将18_014_398_509_481_984限制在0x40000000000000(即254,.spelledOut)上,这似乎可疑地像是源自该值的64位浮点表示的错误。我们无法确定是否不详细了解NSNumberFormatterNSNumber的来源,但我建议这样做是因为,巧合的是,这里的上限恰好是64位浮点类型可以忠实捕获的最大整数值的两倍。

关于ios - NSNumberFormatter.string(来自: ) maximum possible Value exceeded does not result in Overflow - Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42046106/

10-12 05:48