RestAssured中jsonPathEvaluator读取double类型数值出现误差问题求助
RestAssured数值读取精度异常解决方案
问题根因
首先排查路径笔误:你代码中使用的JsonPath为nextTier.maxThreshold,但实际响应体中对应的字段为nextTier.endThreshold,请先确认是否为代码笔误导致的取值错误。
排除路径问题后,该异常的核心原因是浮点数精度丢失:
RestAssured的JsonPath默认会将JSON中的小数值解析为双精度浮点数(double),十进制的149999.99无法被二进制浮点数精确表示,解析时会生成近似值,最终就出现了原值149999.99读取后变为149999.98的偏差,这是二进制浮点数本身的存储特性,不属于框架bug。
修复方案
方案1:全局配置JsonPath用BigDecimal解析小数
统一配置JsonPath的数值返回类型,避免所有小数解析的精度问题:
// 全局配置,建议在测试类初始化时执行一次即可 JsonPath.config = new JsonPathConfig().numberReturnType(JsonPathConfig.NumberReturnType.BIG_DECIMAL); // 取值 BigDecimal endThreshold = response.jsonPath().get("nextTier.endThreshold");
方案2:单次指定返回类型为BigDecimal
如果不需要全局配置,可以在单次取值时指定目标类型:
BigDecimal endThreshold = response.jsonPath().getObject("nextTier.endThreshold", BigDecimal.class);
方案3:业务侧约定数值用字符串返回
如果是内部业务接口,可以和服务端约定金额、阈值这类对精度要求极高的字段用字符串类型返回,从根源上避免所有客户端的浮点数解析误差。
内容的提问来源于stack exchange,提问作者Dipu Krishnan
相关产品推荐
相关产品推荐

