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

标签 ios objective-c nsdictionary nsdata nsjsonserialization

我正在用字典创建 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$1.06";
NSString *amount = [_amountTF.text stringByReplacingOccurrencesOfString:@"S$" withString:@""];
float amt = [amount floatValue];
amt *=100;
NSNumber *num = [NSNumber numberWithFloat:amt];

谁能解释一下这背后的原因?谢谢。

最佳答案

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

您的数字以二进制格式存储,无法准确表示所有十进制值,因此某些值会“四舍五入”为其最接近的二进制值。打印数字时,它会先将您的 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

关于ios - 当 JSON 对象转换为数据然后该数据再次转换回 JSON 对象时,NSNumber 值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50228039/

相关文章:

ios - EKEvent - 更改事件状态

iphone - popViewController iphone

ios遍历NSDictionary

ios - 如何在 Swift 中对 Json 字典数组值进行排序(A-z、0-9 和特殊字符)

ios - 从另一个类 Objective-C 调用时方法不起作用

objective-c - ios编程-格式字符串未使用数据参数

ios - ios如何判断app处于active状态还是inactive状态?

iphone - 如何从 NSDictionary 获取键的对象?

ios - 为什么将字典添加到数组时会重复

ios - 每周本地通知