解析时JSONObjectWithData错误的小数位

Tar*_*era 2 json objective-c ios

在我的一个api中,我得到了响应表单服务器(如果将数据转换为字符串)

{"success":true,"order_id":102232,"Total":68.6,"delivery_time":"7:30PM-10:00PM","delivery_date":"2016-03-25"}
Run Code Online (Sandbox Code Playgroud)

但是当我使用同样的时候

[NSJSONSerialization JSONObjectWithData:data options:self.readingOptions error:&serializationError];
Run Code Online (Sandbox Code Playgroud)

它的回归

{
Total = "68.59999999999999";
"delivery_date" = "2016-03-25";
"delivery_time" = "7:30PM-10:00PM";
"order_id" = 102232;
success = 1;
Run Code Online (Sandbox Code Playgroud)

}

由于总场中小数点后的多个位置,因此在计算中产生问题.

我认为JSON序列化方法在内部转换但不知道如何解决这个问题

Dun*_*n C 7

@gnasher暗示了这个问题,但没有详细解释.

计算机使用二进制浮点在内部表示浮点数.

浮点数通常存储为float或double.在大多数64位平台上,浮点数存储在4个字节中,double存储在8个字节中.

二进制浮点不能完全表示多个十进制值.在内部,68.6以二进制表示为以十进制表示的值为68.59999999999999.这是将您的值保存为浮点数时计算机可以达到68.6的最接近的值.

像浮点数和双精度这样的二进制浮点值没有"小数位数".该值将转换为十进制显示,或转换为字符串,并且在该转换中始终存在舍入错误的可能性.

以此代码为例:

float aFloat = 68.6;
NSLog(@"aFloat = %f", aFloat);
Run Code Online (Sandbox Code Playgroud)

显示:

aFloat = 68.599998
Run Code Online (Sandbox Code Playgroud)

但是,这段代码:

NSLog(@"aFloat (1 decimal place)= %.1f", aFloat);
Run Code Online (Sandbox Code Playgroud)

显示:

aFloat (1 decimal place)= 68.6
Run Code Online (Sandbox Code Playgroud)

您正在解析的JSON字符串中包含不在引号中的数字.将JSON字符串转换为Cocoa对象时,"Total"的值将保存为NSNumber对象,可能在内部使用double类型.

如果您需要对"总计"值进行数学运算,那么您需要将其作为数字.

如果要避免十进制转换错误,请更改服务器代码,将值"Total"作为字符串(引号)发送,而不是数值.然后该JSONObjectWithData函数将其保持为字符串,"68.6"

在这种情况下,您的JSON字符串将如下所示:

{"success":true,"order_id":102232,"Total":"68.6","delivery_time":"7:30PM-10:00PM","delivery_date":"2016-03-25"}
Run Code Online (Sandbox Code Playgroud)

你说"由于总场中十进制后的多个位置,它在计算中产生了问题." 什么问题?在iOS端还是服务器端?