最近在使用fastjson的过程中,发现对于Double和Float类型的字段,如果在转为字符串时过长,在序列化的过程中,
fastjson会默认将其转化为科学计数法。比如Double d = 11111111111.1111111111111; 在序列化的过程中,fastJson会将其转换为1.111111111111111E10的形式,这显然不是我们需要的结果。那么如何解决这个问题呢?
1.避免使用Double类型
我们思考一下,什么时候我们需要类似 11111111111.1111111111111的浮点型呢?对于精度要求高的数字,我们可以使用
BigDecimal来解决这个问题。
比如下面的代码:
- public class TestDouble {
- public static void main(String[] args) {
- Order order = new Order();
- order.setBigMny(new BigDecimal("11111111111.1111111111111"));
- order.setMny(11111111111.1111111111111);
- System.out.println(JSON.toJSONString(order));
- }
- }
- class Order{
- private Double mny;
- private BigDecimal bigMny;
- public Double getMny() {
- return mny;
- }
- public void setMny(Double mny) {
- this.mny = mny;
- }
- public BigDecimal getBigMny() {
- return bigMny;
- }
- public void setBigMny(BigDecimal bigMny) {
- this.bigMny = bigMny;
- }
- }
运行的结果如下:
- {"bigMny":11111111111.1111111111111,"mny":1.111111111111111E10}
可以看出,BigDecimal输出的结果很好的满足了我们的预期。
2.使用FastJson提供的Double类型的处理器
fastjson帮我们预定义了一些类型的序列化处理器,这里我们使用默认的DoubleSerialize来实现我们的功能。当然也可以自定义类型处理器来完成目的。
可以看出默认的序列化处理器格式化的,我们只需要使用的时候配置一下即可。
- public static void main(String[] args) {
- Order order = new Order();
- order.setBigMny(new BigDecimal("11111111111.1111111111111"));
- order.setMny(11111111111.1111111111111);
- SerializeConfig config = SerializeConfig.getGlobalInstance();
- config.put(Double.class, new DoubleSerializer("#.#####"));
- System.out.println(JSON.toJSONString(order));
- }
如上,即可解决问题。这里使用的是全局的配置,如果不想修改全局配置,自己新建一个SerializeConfig即可。