当 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];
现在转换字典。随心所欲
我正在用字典创建 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];
现在转换字典。随心所欲