JSON反序列化时,能否将大型Double数值精准转换为BigDecimal?
问题分析与解决方案
首先明确:一旦JSON解析时把原始数值转成了double,就没法恢复出原始的123345555789123495.38了。因为double的精度只有约15-17位有效数字,你这个数值的整数部分就有17位,加上小数部分的两位,double根本存不下这么精确的数值,解析阶段就已经把原始值近似成了1.23345555789123488E17,后续再转BigDecimal也只能基于这个失真后的数值处理,自然得不到正确结果。
要精准获取这个数值,必须从JSON解析阶段入手,避免把数值转成double,而是直接解析为BigDecimal:
具体解决办法
全局配置JSON解析器(以Jackson为例):
在初始化ObjectMapper时添加配置,让所有浮点型数值都解析为BigDecimal:ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);这样你的
extensionMap里的"amount"字段就会是BigDecimal类型,直接取出后设置小数位即可:BigDecimal amount = (BigDecimal) extensionMap.get("amount"); BigDecimal result = amount.setScale(2, BigDecimal.ROUND_HALF_EVEN);局部指定解析类型:
如果不想全局修改,可以给extensionMap指定泛型类型为ConcurrentHashMap<String, BigDecimal>,或者使用Jackson的@JsonDeserialize注解为该字段指定解析器,强制将数值解析为BigDecimal。(可选)协调客户端修改:
如果客户端可以把"amount"字段改成字符串类型(比如"amount": "123345555789123495.38"),那即使解析为String,再转BigDecimal也能保证精度,但这需要客户端配合调整。
内容的提问来源于stack exchange,提问作者Aleyna
相关产品推荐
相关产品推荐

