fastjson浮点类型显示科学计数法的问题

最近在使用fastjson的过程中,发现对于Double和Float类型的字段,如果在转为字符串时过长,在序列化的过程中,

fastjson会默认将其转化为科学计数法。比如Double d = 11111111111.1111111111111; 在序列化的过程中,fastJson会将其转换为1.111111111111111E10的形式,这显然不是我们需要的结果。那么如何解决这个问题呢?

1.避免使用Double类型

我们思考一下,什么时候我们需要类似 11111111111.1111111111111的浮点型呢?对于精度要求高的数字,我们可以使用

BigDecimal来解决这个问题。

比如下面的代码:

  1. public class TestDouble {  
  2.       
  3.     public static void main(String[] args) {  
  4.           
  5.         Order order = new Order();  
  6.         order.setBigMny(new BigDecimal("11111111111.1111111111111"));  
  7.         order.setMny(11111111111.1111111111111);  
  8.           
  9.         System.out.println(JSON.toJSONString(order));  
  10.     }  
  11. }  
  12. class Order{  
  13.     private Double mny;  
  14.       
  15.     private BigDecimal bigMny;  
  16.   
  17.       
  18.     public Double getMny() {  
  19.         return mny;  
  20.     }  
  21.   
  22.     public void setMny(Double mny) {  
  23.         this.mny = mny;  
  24.     }  
  25.   
  26.     public BigDecimal getBigMny() {  
  27.         return bigMny;  
  28.     }  
  29.   
  30.     public void setBigMny(BigDecimal bigMny) {  
  31.         this.bigMny = bigMny;  
  32.     }  
  33.   
  34. }  

运行的结果如下:

  1. {"bigMny":11111111111.1111111111111,"mny":1.111111111111111E10}  

可以看出,BigDecimal输出的结果很好的满足了我们的预期。

2.使用FastJson提供的Double类型的处理器

fastjson浮点类型显示科学计数法的问题

  fastjson帮我们预定义了一些类型的序列化处理器,这里我们使用默认的DoubleSerialize来实现我们的功能。当然也可以自定义类型处理器来完成目的。

fastjson浮点类型显示科学计数法的问题

可以看出默认的序列化处理器格式化的,我们只需要使用的时候配置一下即可。

  1. public static void main(String[] args) {  
  2.           
  3.         Order order = new Order();  
  4.         order.setBigMny(new BigDecimal("11111111111.1111111111111"));  
  5.         order.setMny(11111111111.1111111111111);  
  6.           
  7.         SerializeConfig config = SerializeConfig.getGlobalInstance();  
  8.         config.put(Double.classnew DoubleSerializer("#.#####"));  
  9.           
  10.         System.out.println(JSON.toJSONString(order));  
  11.     }  

如上,即可解决问题。这里使用的是全局的配置,如果不想修改全局配置,自己新建一个SerializeConfig即可。