You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift iOS解析JSON获取Double转字符串时出现多余小数尾缀问题

问题根因
  • 该问题是64位二进制浮点数(Double类型)的精度特性导致的,不属于JSON解析库的bug。Double遵循IEEE 754标准,绝大多数十进制小数无法被二进制浮点数精确存储,只能保存近似值,直接将Double转换为字符串时,会把底层存储的近似值完整输出,就会出现小数末尾带0000000001这类冗余尾缀的情况。
  • 你当前的代码直接调用SwiftyJSON的.stringValue获取字段值时,底层会先把JSON数值解析为Double类型,再直接转成字符串,没有做精度截断处理,因此把浮点数的存储误差直接暴露了出来。
修复方案

根据你的业务场景选对应方案即可:

方案1:固定小数位格式化(适合金额类固定2位小数的场景)

你给出的示例数值都是2位小数,属于典型的金额类场景,用NumberFormatter做格式化输出即可,注意格式化器要复用,不要在循环内重复创建影响性能:

// 提前定义可复用的数值格式化器
let twoDecimalFormatter: NumberFormatter = {
    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
    formatter.roundingMode = .halfUp // 常规四舍五入规则
    return formatter
}()

// 替换原有解析逻辑
if !list.isEmpty {
    for i in 0..<list.count {
        let item = list[i]
        let doubleValue = item["decPOBValue_Product"].doubleValue
        let formattedValue = twoDecimalFormatter.string(from: NSNumber(value: doubleValue)) ?? ""
        let obj = lstDailyWorkDetailModal(
            varEmpCode: item["varEmpCode"].stringValue,
            decPOBValue_Product: formattedValue
        )
        self.detailReportModal.append(obj)
    }
}

方案2:直接取JSON原始字符串(适合需要和JSON原始文本完全一致的场景)

不需要经过Double类型中转,直接从JSON中取原始字符串值,从根源避免浮点数转换误差:

let rawValueStr = item["decPOBValue_Product"].rawString() ?? ""

方案3:用Decimal类型做高精度存储(适合后续还要做数值计算的场景)

如果该字段后续还要做加减乘除运算,不要用Double类型存储,改用Decimal类型做高精度计算,从根源规避二进制浮点数的精度问题:

// 解析为Decimal类型
let decimalValue = item["decPOBValue_Product"].decimalValue

注意:不要用字符串拼接、字符串截取的方式硬删末尾的冗余数字,遇到不同数值的误差长度不一样时会出问题。

内容的提问来源于stack exchange,提问作者Sagar Zala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:24:28