我正在处理来自 JSON 源的大型 64 位无符号整数,这些整数被解析为 NSDecimalNumbers,这显然是“忠实地表示任意精度数字”。
我遇到的问题是我无法从这门课中得到正确的数字。例如(使用可能的最大值):
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] unsignedLongLongValue]
= 0 // Incorrect
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775808"] unsignedLongLongValue]
= 9223372036854775808 // Correct
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775810"] unsignedLongLongValue]
= 9223372036854775808 // Incorrect
看来我无法从 NSDecimalNumber 中获取大于最大有符号 long long 值的任何值。它不喜欢大于 9223372036854775808 的值。但是,该数字似乎以全精度存储在 NSDecimalNumber 中,如下所示:
po [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] stringValue]
= 18446744073709551615
我注意到 NSNumber 对象可以很好地处理这些大数字,并且 unsignedLongLongValue 可以正常工作。这只是 NSDecimalNumbers (我一直坚持使用)不起作用。
如何从 NSDecimalNumbers 中获取正确的 unsigned long long 值?或者至少将它们转换为 NSNumber 对象,其中 unsignedLongLongValue 可以工作。
我通过开发者论坛收到了 Apple 关于此问题的回复:
这是 NSDecimalNumber 的一个长期问题,其中简单的
访问器(例如 [unsigned]longLongValue)通过 doubleValue
访问器 – 这是任何需要超过 53 位精度的值
将被不恰当地舍入。请随时报告有关此的错误
问题并提及错误号 8220543。
也就是说,如果你只是
从 JSON 获取 64 位数字,您应该能够使用
NSNumber 而不是 NSDecimalNumber。
因此,我通过将解析器从 SBJson 更改为 JSONKit 来解决这个问题,这不仅更快,而且还将数字映射到 NSNumber 对象而不是 NSDecimalNumber 对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)