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

Android Double序列化异常:API返回值精度丢失问题求助

问题:Kotlin Serialization解析Double类型时出现精度丢失(19.044变为19.04)

API返回的JSON数据:

{
  "QUANTITYKG": 19.044,
  "QUANTITYPC": 6.0,
  "QUANTITYM": 36.0,
  "QUANTITYM2": 0.0
}

Android项目中使用的Kotlin Serialization数据类:

@Serializable
data class Data(
    @SerialName("QUANTITYKG")
    val quantityKg: Double,
    @SerialName("QUANTITYPC")
    val quantityPc: Double,
    @SerialName("QUANTITYM")
    val quantityM: Double,
    @SerialName("QUANTITYM2")
    val quantityM2: Double
)

解析后quantityKg的值变为19.04,而非API返回的19.044,尝试格式化响应等方法无效,求排查解决。


排查方向及解决办法

1. 确认是显示截断还是实际精度丢失

Double作为浮点数,部分十进制小数无法精确表示,但19.044的精度丢失到19.04大概率是显示问题:

  • 用String.format("%.10f", quantityKg)或quantityKg.toPlainString()打印完整值,查看实际存储的是否是19.044的近似值(比如19.043999999999998),如果是,说明值本身没丢,只是默认展示时被截断了。

2. 检查Kotlin Serialization的解析配置

默认情况下Kotlin Serialization不会主动截断Double精度,但若自定义了序列化规则可能出问题:

  • 尝试使用默认配置的Json实例解析,排除自定义配置干扰:
    val json = Json {
        ignoreUnknownKeys = true
        isLenient = true
    }
    val data = json.decodeFromString<Data>(responseBody)
    

3. 抓包验证API原始响应

用Android Studio的Network Inspector或第三方工具抓包,确认服务器返回的原始JSON中QUANTITYKG确实是19.044,而非后端序列化时已被截断为19.04。

4. 改用BigDecimal彻底解决精度问题

如果业务需要精确的十进制数值,建议替换Double为BigDecimal:

  • 修改数据类:
    @Serializable
    data class Data(
        @SerialName("QUANTITYKG")
        val quantityKg: BigDecimal,
        @SerialName("QUANTITYPC")
        val quantityPc: BigDecimal,
        @SerialName("QUANTITYM")
        val quantityM: BigDecimal,
        @SerialName("QUANTITYM2")
        val quantityM2: BigDecimal
    )
    
  • Kotlin Serialization原生支持BigDecimal解析,无需额外配置,可完全保留原始精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:33:19