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