JSON中非常大的ID,如何获得它而不会丢失精度

时间:2014-12-09 21:06:44

标签: ios json nsdecimalnumber

我在JSON文件中有ID,其中一些非常大但是它们适合在unsigned long long int的范围内。

"id":9223372036854775807,

如何使用NSDictionary的objectForKey:idKey从JSON获取这个大数字? 我可以使用NSDecimalNumber吗?其中一些ID适合常规整数。

2 个答案:

答案 0 :(得分:3)

棘手。 Apple的JSON代码将高于10 ^ 18的整数转换为NSDecimalNumber,将较小的整数转换为包含64位整数值的纯NSNumber。现在你可能希望unsignedLongLongValue会给你一个64位的值,但它不适用于NSDecimalNumber:NSDecimalNumber首先转换为double,结果转换为unsigned long long,这样你就失去了精度。

您可以添加一些内容作为NSNumber的扩展。这有点棘手,因为如果你得到一个非常接近2 ^ 64的值,将它转换为double可能会四舍五入到2 ^ 64,这不能转换为64位。所以我们需要先除以10,以确保结果不是太大。

- (uint64_t)unsigned64bitValue
{
    if ([self isKindOfClass:[NSDecimalNumber class]])
    {
        NSDecimalNumber* asDecimal = (NSDecimalNumber *) self;
        uint64_t tmp = (uint64_t) (asDecimal.doubleValue / 10.0);

        NSDecimalNumber* tmp1 = [[NSDecimalNumber alloc] initWithUnsignedLongLong:tmp];
        NSDecimalNumber* tmp2 = [tmp1 decimalNumberByMultiplyingByPowerOf10: 1];
        NSDecimalNumber* remainder = [asDecimal decimalNumberBySubtracting:tmp2];

        return (tmp * 10) + remainder.unsignedLongLongValue;
    }
    else
    {
        return self.unsignedLongLongValue;
    }
}

答案 1 :(得分:0)

或处理原始JSON字符串,查找“”id“= number; ”。通常包含空格,您可以找到该数字,然后用引号引用它。您可以将数据放入可变数据对象并获取指向它的char指针,以覆盖。

[使用iPhone输入有点简洁]