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

如何从JSON数组的Double类型数据中获取精确真实值

解决JSON中精确数值获取的浮点数精度问题

你遇到的核心问题是浮点数的精度局限性——Double和Float这类二进制浮点数无法精确表示所有十进制小数,像82015372.06这样的数值在被解析为Double时,内部存储的其实是一个近似值,后续转换自然会出现偏差。

正确的解决方案:使用BigDecimal获取精确值

JSON解析库(比如Jackson、Gson等)通常都提供了直接获取BigDecimal的方法,它可以完整保留原始的十进制数值精度,完全避免浮点数误差:

// 直接获取BigDecimal类型的精确值
BigDecimal exactLodgValue = obj.getJSONArray("lodg").getBigDecimal(3);

// 如果需要输出为普通字符串(避免科学计数法)
String exactStr = exactLodgValue.toPlainString(); // 结果为 "82015372.06"

// 若需进行数值计算,直接使用BigDecimal的内置方法(保证精度)
BigDecimal tax = exactLodgValue.multiply(new BigDecimal("0.05"));

为什么之前的方法会失败?

  • Double转换:getDouble(3)得到的8.201537206E7是Double的科学计数法表示,但Double无法精确存储82015372.06,内部是一个接近该值的二进制近似值,后续操作必然有误差。
  • Long转换:longValue()会直接截断小数部分,丢失.06这部分信息,结果自然是82015372。
  • Float转换:Float的有效精度只有6-7位,比Double更低,转换后会进一步丢失精度,得到8.2015376E7这种偏差更大的结果。

注意事项

如果你的业务场景涉及精确数值计算(比如财务、金额类场景),全程都应该用BigDecimal来处理,不要中途转换为Double/Float,否则精度丢失的问题会一直存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:24:48