当 JSON 对象转换为数据然后该数据再次转换回 JSON 对象时 NSNumber 值发生变化

NSNumber value changing when JSON object is converted to data and then that data is again converted back to JSON object

我正在用字典创建 NSData 对象,

词典:

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

price = 106

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

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

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

但是我这次打错价格了

转换字典

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

price = "105.9999923706055"

生成NSNumber的代码,

//_amountTF.text = "S.06";
NSString *amount = [_amountTF.text stringByReplacingOccurrencesOfString:@"S$" withString:@""];
float amt = [amount floatValue];
amt *=100;
NSNumber *num = [NSNumber numberWithFloat:amt];

任何人都可以向我解释这背后的原因吗?谢谢。

这是一个浮点精度问题。使用 double 而不是 float.

您的号码以二进制格式存储,无法准确表示所有十进制值,因此某些值是 "rounded" 最接近的二进制值。打印数字时,它会先将您的 float 转换为 double,然后再打印。转换为 double 将采用您的舍入二进制表示并以更高的精度存储,使其具有高精度,其中包含低精度内容。打印此内容将显示您在使用浮点精度时获得的近似值。

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

阅读更多:'float' vs. 'double' precision

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

价格= [NSString stringWithFormat:@"106"]; 要么, int 价格值 = 106; 价格 = [NSString stringWithFormat:@"%d",priceValue];

现在转换字典。随心所欲