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
相关产品推荐
相关产品推荐

