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

Mr.*_*der 5 overflow nsnumberformatter ios swift

我正在将数字转换为纯英语单词,我遇到了一些非常奇怪的情况:NSNumberFormatter输出奇怪,小于所需的结果,但作为参数的数字不会导致溢出.

我有以下代码:

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

这打印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..,它崩溃与消息:

9999999999999999999存储到的整数文字溢出Int

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


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

Rob*_*Rob 4

由于它大于is (即),因此9_999_999_999_999_999_999会导致溢出。IntInt64.max9_223_372_036_854_775_8070x7fffffffffffffff

18_014_398_509_481_984关于为什么数字格式化程序在(即 2 54 , 0x40000000000000)处设置上限.spelledOut,这似乎可疑是源于该值的 64 位浮点表示形式的错误。如果不详细查看源代码,我们无法确定,但我建议这样做,因为巧合的是,这里的上限恰好是 64 位浮点类型可以忠实捕获的最大整数值的NSNumberFormatter两倍。NSNumber