1. 程式人生 > 其它 >springboot框架下BigDecimal 處理小數點並返回至前端問題整理

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