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



我正在将数字转换为纯英语单词,我遇到了一些非常奇怪的情况: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>

整数文本9999999999999999999在存储到 Int 中时溢出

这是一个 Swift 沙盒测试,以使问题更容易理解


我的实际问题是:假设第一次尝试的输出:180140398509481984numberFormatter.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(即 2 54,0x40000000000000(,这似乎可疑地像源于值的64 位浮点表示的错误。如果不详细浏览NSNumberFormatterNSNumber源,我们无法确定,但我建议这样做,因为巧合的是,这里的上限恰好是 64 位浮点类型可以忠实捕获的最大整数值的两倍。

最新更新