dromara / hutool

🍬A set of tools that keep Java sweet.
https://hutool.cn
Other
29.25k stars 7.54k forks source link

JSONUtil.toJsonStr在BigDecimal的序列化处理后丢失了精度 #3790

Closed flyunet closed 1 week ago

flyunet commented 1 week ago

版本情况

JDK版本: openjdk_21 hutool版本: 5.8.32

问题描述

  1. 复现代码
    static class Dto {
        public BigDecimal remain;
    }

    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("0.01");
        bigDecimal = bigDecimal.setScale(4, BigDecimal.ROUND_HALF_UP);
        System.out.println(bigDecimal);
        Dto dto = new Dto();
        dto.remain = bigDecimal;
        System.out.println(JSONUtil.toJsonStr(dto));
    }
  1. 结果: 0.0100 {"remain":0.01}

JSONUtil.toJsonStr在BigDecimal的序列化处理后丢失了精度。

flyunet commented 1 week ago

5.8.33 仍然存在此问题,用Map、List等容器包装也会重现精度丢失的问题。

looly commented 1 week ago

@flyunet JSON配置中有个setStripTrailingZeros表示是否默认去除末尾多余0,默认true。你可以:

JSONUtil.toJsonStr(dto, JSONConfig.create().setStripTrailingZeros(false));