You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DecimalFormat格式化double后存入HashMap转JSON时变为字符串的问题

解决Double类型转JSON时0.0/0.00显示为数字0的问题

哥们,我太懂你踩的这个坑了——用DecimalFormat格式化后存进HashMap,转JSON就变成字符串,明明直接打印是数字,序列化就变了样。核心问题其实很简单:你存进HashMap的是字符串类型,Gson自然会按字符串规则序列化它。下面给你两个靠谱的解决思路:

思路一:存入HashMap前提前处理值

既然要输出数字类型,那就在把数据放进HashMap的时候,先判断是否为0.0,是的话直接存整数0(或者Double类型的0都行),非0值就存原Double数据。这样Gson序列化时识别的是数字类型,输出自然是数字:

// 假设你的动态Double数据是这个变量
Double dynamicData = ...;
HashMap<String, Object> dataMap = new HashMap<>();

// 判断是否为0.0(如果是计算得到的近似0,建议用Math.abs(dynamicData) < 1e-9来判断,避免精度问题)
if (dynamicData != null && dynamicData.compareTo(0.0) == 0) {
    dataMap.put("your_key", 0); // 存Integer类型的0,Gson会转成数字0
} else {
    dataMap.put("your_key", dynamicData); // 非0值存原Double
}

// 用Gson序列化
Gson gson = new Gson();
String json = gson.toJson(dataMap);

思路二:用Gson自定义序列化器(更优雅)

如果不想每次存数据都手动判断,可以让Gson在序列化Double类型时自动处理——自定义一个TypeAdapter,让它遇到0.0时输出整数0,其他情况正常输出数字:

// 构建自定义Gson实例
Gson customGson = new GsonBuilder()
        .registerTypeAdapter(Double.class, new TypeAdapter<Double>() {
            @Override
            public void write(JsonWriter out, Double value) throws IOException {
                if (value != null) {
                    // 处理近似0的情况,避免计算精度导致的误判
                    if (Math.abs(value) < 1e-9) {
                        out.value(0); // 写入整数0
                    } else {
                        out.value(value); // 正常写入Double值
                    }
                } else {
                    out.nullValue(); // 处理null的情况
                }
            }

            @Override
            public Double read(JsonReader in) throws IOException {
                // 反序列化逻辑,不需要特殊处理的话直接返回Double即可
                return in.nextDouble();
            }
        })
        .create();

// 直接序列化你的HashMap就行
String json = customGson.toJson(dataMap);

这样不管你HashMap里存的是0.0还是其他Double值,Gson都会帮你把0.0转成数字0,全程不用手动修改存入的数据,省心又优雅。

内容的提问来源于stack exchange,提问作者Srikar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:11:41