fastjson浮点类型显⽰科学计数法的问题
最近在使⽤fastjson的过程中,发现对于Double和Float类型的字段,如果在转为字符串时过长,在序列化的过程中,
fastjson会默认将其转化为科学计数法。⽐如Double d = 11111111111.1111111111111; 在序列化的过程
中,fastJson会将其转换为1.111111*********E10的形式,这显然不是我们需要的结果。那么如何解决这个问题呢?
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.JSONString(order));
10.    }
11. }
12. class Order{
13. private Double mny;
14.
15. private BigDecimal bigMny;
16.bigdecimal格式化两位小数
17.
18. public Double getMny() {
19. return mny;
20.    }
21.
22. public void setMny(Double mny) {
23. = 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.111111*********E10}
可以看出,BigDecimal输出的结果很好的满⾜了我们的预期。
2.使⽤FastJson提供的Double类型的处理器
fastjson帮我们预定义了⼀些类型的序列化处理器,这⾥我们使⽤默认的DoubleSerialize来实现我们的功能。当然也可以⾃定义类型处理器来完成⽬的。
可以看出默认的序列化处理器格式化的,我们只需要使⽤的时候配置⼀下即可。
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 = GlobalInstance();
8.        config.put(Double.class, new DoubleSerializer("#.>"));
9.
10.        System.out.JSONString(order));
11.    }
如上,即可解决问题。这⾥使⽤的是全局的配置,如果不想修改全局配置,⾃⼰新建⼀个SerializeConfig即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论