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
,结果就是我所期望的结果,即上面描述的字符串.不过,如果我多了一个补充9
到 999..
,它崩溃与消息:
9999999999999999999
存储到的整数文字溢出Int
这是一个Swift沙盒测试,以使问题更容易理解.
我的实际问题是:假设第一次尝试的输出:180140398509481984
是某种限制numberFormatter.string(from:)
,为什么不999999999999999999
导致溢出,但只显示该限制,并且9999999999999999999
(额外的9)导致溢出?
由于它大于is (即),因此9_999_999_999_999_999_999
会导致溢出。Int
Int64.max
9_223_372_036_854_775_807
0x7fffffffffffffff
18_014_398_509_481_984
关于为什么数字格式化程序在(即 2 54 , 0x40000000000000
)处设置上限.spelledOut
,这似乎可疑是源于该值的 64 位浮点表示形式的错误。如果不详细查看源代码,我们无法确定,但我建议这样做,因为巧合的是,这里的上限恰好是 64 位浮点类型可以忠实捕获的最大整数值的NSNumberFormatter
两倍。NSNumber
归档时间: |
|
查看次数: |
810 次 |
最近记录: |