我正在将数字转换为纯英语单词,我遇到了一些非常奇怪的情况: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 沙盒测试,以使问题更容易理解。
我的实际问题是:假设第一次尝试的输出: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
(即 2 54,0x40000000000000
(,这似乎可疑地像源于值的64 位浮点表示的错误。如果不详细浏览NSNumberFormatter
和NSNumber
源,我们无法确定,但我建议这样做,因为巧合的是,这里的上限恰好是 64 位浮点类型可以忠实捕获的最大整数值的两倍。