当JSON对象转换为数据时NSNumber值更改,然后该数据再次转换回JSON对象

时间:2018-05-08 07:20:06

标签: ios objective-c nsdictionary nsdata nsjsonserialization

我正在用字典创建Connection对象,如下所示,

字典

NSData
  

price = 106

{
    channelId = 201;
    lang = EN;
    reqRefNo = vZRIzNd;
    storeInfo =     {
        clientInfo =         {
            deviceId = XXXXXXXXA67F488B836D19D80EC4FD8D;
        };
        loginLogId = XXXXXXXX5CAD4A0DA06BE2F055929856;
        qrCodeInfo =         {
            itemDesc = "";
            itemName = hahsj;
            price = 106;
        };
        userInfo =         {
            storeId = 3252;
        };
    };
}

现在我再次将其转换回JSON对象,如下所示,

NSData *data = [NSJSONSerialization dataWithJSONObject:paramDict options:kNilOptions error:nil];

但这次我的价格错了。

转换字典

NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data
                                                         options:kNilOptions
                                                       error:&error];
  

price =" 105.9999923706055"

生成NSNumber的代码,

{
    channelId = 201;
    lang = EN;
    reqRefNo = vZRIzNd;
    storeInfo =     {
        clientInfo =         {
            deviceId = XXXXXXXXA67F488B836D19D80EC4FD8D;
        };
        loginLogId = XXXXXXXX5CAD4A0DA06BE2F055929856;
        qrCodeInfo =         {
            itemDesc = "";
            itemName = hahsj;
            price = "105.9999923706055";
        };
        userInfo =         {
            storeId = 3252;
        };
    };
}

任何人都可以解释一下这背后的原因吗?感谢。

2 个答案:

答案 0 :(得分:2)

这是一个浮点精度问题。使用double代替float

您的号码以二进制格式存储,无法准确表示所有十进制值,因此某些值会“舍入”到最接近的二进制值。打印数字时,它会将您的浮动转换为双倍,然后打印。转换为double将使您的舍入二进制表示和存储具有更高的精度,使其具有高精度和低精度内容。打印此图将显示使用浮动精度时的近似值。

NSString *amount = [_amountTF.text stringByReplacingOccurrencesOfString:@"S$" withString:@""];
double amt = [amount doubleValue];
amt *=100;
NSNumber *num = [NSNumber numberWithDouble:amt];

了解详情:'float' vs. 'double' precision

答案 1 :(得分:0)

同时。创建字典添加价格值:

price = [NSString stringWithFormat:@“ 106”]; 要么, int priceValue = 106; 价格= [NSString stringWithFormat:@“%d”,priceValue];

现在已转换字典。随您便。