我正在用字典创建 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];
关于ios - 当 JSON 对象转换为数据然后该数据再次转换回 JSON 对象时,NSNumber 值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50228039/