Swift NSNumberFormatterStyle.SpellOutStyle中的错误?

Swift NSNumberFormatterStyle.SpellOutStyle中的错误?,swift,cocoa,Swift,Cocoa,当我使用NSNumberFormatterStyle.SpellOutStyle来表示较大的数字(而不是溢出类型的数字)时,它似乎在几十亿分之一左右的某个地方崩溃了 let formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.SpellOutStyle print(formatter.stringFromNumber(50000000000000000)) 产量:壹仟捌佰肆拾肆亿叁仟玖佰捌

当我使用NSNumberFormatterStyle.SpellOutStyle来表示较大的数字(而不是溢出类型的数字)时,它似乎在几十亿分之一左右的某个地方崩溃了

let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.SpellOutStyle
print(formatter.stringFromNumber(50000000000000000))
产量:壹仟捌佰肆拾肆亿叁仟玖佰捌拾伍亿玖佰肆拾捌万壹仟玖佰捌拾肆元


这是怎么回事?虫子?还是我遇到了一些我不知道的极限?Int在2^63之前不会溢出,它是64位有符号的Int。。。但是数字格式化程序的限制是2^54?

我没有解决方案,但我有一个猜测:

NSNumberFormatter使用一个Double来存储值(53位),因此您的值太大


我想它会使格式化程序生成错误的拼写,而不是出现真正的错误消息:所以我想说是的,这是NSNumberFormatterStyle.SpellOutStyle的一个错误,失败时不应该吐出一个伪值。

NSNumber不是基于double构建的。它是一个类群集,可以保存64位整数而不存在精度问题(
NSNumber(longLong:)
)。它还有NSDecimalNumber子类,它表示最多38位十进制数字的十进制数当然可能是NSNumberFormatter在内部使用了
double
。@Martin谢谢Martin。我已经更改了答案的措辞(删除了“NSNumber基于…”部分)。如果您认为它仍然错误或太模糊,我将删除它。顺便说一句,输出18014398509481984是十六进制
40000
,是一个55位的数字。这可能与二进制双精度(稍微小一点)中尾数的大小有关但这里有一个有趣的问题:如果将德语的本地化改为“de”,则输出是
“fünfzig Billiarden null”
。“null”没有任何意义,但“fünfzig Billiarden”是一个正确的结果:)–在任何情况下,它都是一个bug,没有看到源代码,我们只能猜测bug来自何处。