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

