gpt4 book ai didi

ios - JSONObjectWithData 解析时错误的小数位

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:00:50 24 4
gpt4 key购买 nike

在我的一个 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 序列化方法在内部转换它,但不知道如何解决这个问题

最佳答案

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

计算机内部使用二进制 float 来表示 float 。

float 通常存储为 float 或 double。在大多数 64 位平台上, float 以 4 个字节存储, double 以 8 个字节存储。

二进制 float 不能精确地表示许多十进制值。在内部,68.6 以二进制表示为十进制为 68.59999999999999 的值。这是计算机将您的值保存为 float 时最接近 68.6 的值。

像 float 和 double 这样的二进制浮点值没有“小数位数”。该值被转换为小数以供显示,或转换为字符串,并且总是在该转换中存在舍入错误的可能性。

以这段代码为例:

float aFloat = 68.6;
NSLog(@"aFloat = %f", aFloat);

显示:

aFloat = 68.599998

但是,这段代码:

NSLog(@"aFloat (1 decimal place)= %.1f", aFloat);

显示:

aFloat (1 decimal place)= 68.6

您正在解析的 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"}

您说“由于总计字段中小数点后有多个位,因此在计算中会产生问题。”什么问题?在 iOS 端,还是服务器端?

关于ios - JSONObjectWithData 解析时错误的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com