在我的一个api中,我得到了响应表单服务器(如果将数据转换为字符串)
{"success":true,"order_id":102232,"Total":68.6,"delivery_time":"7:30PM-10:00PM","delivery_date":"2016-03-25"}
但是当我和
一起使用时[NSJSONSerialization JSONObjectWithData:data options:self.readingOptions error:&serializationError];
返回
{
Total = "68.59999999999999";
"delivery_date" = "2016-03-25";
"delivery_time" = "7:30PM-10:00PM";
"order_id" = 102232;
success = 1;
}
由于总字段中小数点后的多个位置,因此在计算中会产生问题。
我认为JSON序列化方法在内部转换它但不知道如何解决这个问题
答案 0 :(得分:7)
@gnasher暗示了这个问题,但没有详细解释。
计算机使用二进制浮点在内部表示浮点数。
浮点数通常存储为float或double。在大多数64位平台上,float以4个字节存储,double以8个字节存储。
二进制浮点不能准确表示多个十进制值。在内部,68.6以二进制表示为以十进制表示的值为68.59999999999999。这是将您的值保存为浮点数时计算机可以达到68.6的最接近的值。
像浮点数和双精度数这样的二进制浮点值没有"小数位数。"该值将转换为十进制显示或转换为字符串,并且始终可能会在该转换中出现舍入错误。
以此代码为例:
aFloat = 68.599998
显示:
NSLog(@"aFloat (1 decimal place)= %.1f", aFloat);
但是,这段代码:
aFloat (1 decimal place)= 68.6
显示器:
JSONObjectWithData
您正在解析的JSON字符串中包含不在引号中的数字。当您将JSON字符串转换为Cocoa对象时," Total"的值被保存为NSNumber对象,可能在内部使用double类型。
如果你需要对你的" Total"进行数学计算。价值然后你需要它成为一个数字。
如果您想避免十进制转换错误,请更改您的服务器代码以发送值" Total"作为字符串,(在引号中)不是数值。然后"68.6"
函数会将其保留为字符串{"success":true,"order_id":102232,"Total":"68.6","delivery_time":"7:30PM-10:00PM","delivery_date":"2016-03-25"}
在这种情况下,您的JSON字符串将如下所示:
$("select.drp").on('change', function () {
var val = $(this).val();
console.log(val);
var selectedid=$(this).attr("id");
var selectedIndex = $("select#"+selectedid).prop('selectedIndex');
// alert(selectedIndex);
if(selectedid=="drp1")
{
if(selectedIndex==0)
{
$("select#drp2").prop('selectedIndex',1);
}
else
{
$("select#drp2").prop('selectedIndex',0);
}
}
else
{
if(selectedIndex==0)
{
$("select#drp1").prop('selectedIndex',1);
}
else
{
$("select#drp1").prop('selectedIndex',0);
}
}
//Figure out which dropdown triggered the change event.
//Let its current value selected but now change the dropdown that didn't triggere the change event with another value
});
你说"由于总字段中小数点后的多个位置,它在计算中产生了问题。"什么问题?在iOS端还是服务器端?
答案 1 :(得分:1)
这解决了我的问题
NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
[fmt setPositiveFormat:@"0.##"];
NSLog(@"%@", [fmt stringFromNumber:dataDict[@"Total"]]);
此日志的输出为 68.6
答案 2 :(得分:0)
您正在使用浮点运算。你所看到的是绝对正常的。如果你刚刚分配了68.6,你会发生完全相同的事情。
你如何解决这个问题?通过学习浮点运算。但是你真正看到了什么问题?你只是因为看到大量的9号而感到恐慌,还是存在实际问题?
是什么让你真正认为将数据转换回JSON会产生服务器误解的东西?你试过吗?您是否担心理论上的可能性,或者您是否有实际的问题证据?显然,服务器存储了四舍五入到一位小数的东西。
我的意思是,你真的认为你担心的是NSLog语句的输出吗?
答案 3 :(得分:0)
迅速解析时遇到相同的问题,后端团队发送的是小数。只需将其隐藏到Float。
let value = Float(48.9999999999)
print(value) // 49.0
let value = Float(48.9799999999)
print(value) // 48.98