springboot框架下BigDecimal 处理小数点并返回至前端问题整理


场景:要求将查询到的dto的BigDecimal类型的数据装换成规定的小数点传值前端显示。

处理:

   BigDecimal b1=new BigDecimal(1.000);
  b1.divide(BigDecimal.ONE, 2, BigDecimal.ROUND_HALF_UP);//四舍五入保留两位小数
  b1.divide(BigDecimal.ONE, 4, BigDecimal.ROUND_HALF_UP);//四舍五入保留四位小数

结果:传至前端发现得到的值是1,传值的过程中精度丢失。

解决方案:百度了下,增加一个配置类,该类作为WebMvcConfigurerAdapter的子类,重写configureMessageConverters的方法
 1 @Override
 2     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 3         //1、定义一个convert转换消息的对象
 4         FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
 5         //2、添加fastJson的配置信息
 6         FastJsonConfig fastJsonConfig = new FastJsonConfig();
 7         fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
 8         fastJsonConfig.setSerializeFilters((ValueFilter) (object, name, value) -> {
 9             if (value == null) {
10                 return null;
11             }
12             if (value instanceof Long) {// 解决long精度丢失问题
13                 return value.toString();
14             }
15             if (value instanceof BigDecimal) {//解决bigDecimal精度丢失问题
16                 return value.toString();
17             }
18             return value;
19         });
20         //3、在convert中添加配置信息
21         fastConverter.setFastJsonConfig(fastJsonConfig);
22         //4、将convert添加到converters中
23         converters.add(fastConverter);
问题解决。
但是过了几天,又发现了一个奇怪的问题

场景:前端调用后端的接口,发现所有返回的数据中值为null的json字段,会连带着字段一起不传

返回结果:dto(aa=1, bb=null),前端接收到的json{"aa":1},匪夷所思。查了很多资料,才发现是fastJsonConfig的序列化问题导致的

解决方案:
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue, SerializerFeature.SortField);

把上面第7行,增加个SerializerFeature.WriteMapNullValue 的序列化,问题解决。但是为了观察字段方便,也可以再加个排序的序列化 SerializerFeature.SortField

 



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM