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

如何在JSONArray中对Double类型数值进行保留两位小数处理?

解决JSON数组中Double值保留两位小数的问题(非流实现)

问题背景

从API获取JSON数据并转为嵌套Map结构后,单个Double值可通过printf("%.2f")保留两位小数打印,但JSON数组中的元素无法直接用该方式格式化,需在不使用流的前提下解决此问题。

解决方案

核心逻辑:将Map中取出的数组对象转为JSONArray(json-simple库解析数组会返回该类型),通过普通for循环遍历数组元素,逐个格式化后拼接成数组格式字符串输出。

修改后的完整代码

package doplomski.rad.glavna;

import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.math.BigDecimal;
import java.net.URI;
import java.util.*;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpClient;
import java.io.IOException;

public class Glavna {
    public static void main(String[] args) throws ParseException {

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("API url"))
                .header("X-RapidAPI-Host", "website url")
                .header("X-RapidAPI-Key", "key")
                .method("GET", HttpRequest.BodyPublishers.noBody())
                .build();

        HttpResponse<String> response = null;

        try {
            response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(response.body());
        System.out.println();

        Object obj = new JSONParser().parse(response.body());

        // 调整泛型适配数组类型
        Map<String, Map<String, Object>> output = (Map) obj;
        Map<String, Object> outputsMap = output.get("outputs");

        // 格式化单个数值
        System.out.printf("%.2f%n", outputsMap.get("ac_annual"));
        System.out.printf("%.2f%n", outputsMap.get("solrad_annual"));
        System.out.printf("%.2f%n", outputsMap.get("capacity_factor"));

        // 调用自定义方法格式化数组
        printFormattedArray((JSONArray) outputsMap.get("ac_monthly"));
        printFormattedArray((JSONArray) outputsMap.get("dc_monthly"));
        printFormattedArray((JSONArray) outputsMap.get("poa_monthly"));
        printFormattedArray((JSONArray) outputsMap.get("solrad_monthly"));
    }

    // 自定义数组格式化方法
    private static void printFormattedArray(JSONArray array) {
        if (array == null || array.isEmpty()) {
            System.out.println("[]");
            return;
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < array.size(); i++) {
            Double value = (Double) array.get(i);
            // 保留两位小数
            sb.append(String.format("%.2f", value));
            // 添加分隔符(非最后一个元素)
            if (i != array.size() - 1) {
                sb.append(", ");
            }
        }
        sb.append("]");
        System.out.println(sb.toString());
    }
}

关键修改说明

  1. 泛型调整:将Map<String, Map<String, BigDecimal>>改为Map<String, Map<String, Object>>,适配数组类型,避免强制转换错误。
  2. 新增格式化方法:printFormattedArray负责遍历数组,逐个格式化元素并拼接成标准数组格式字符串。
  3. 替换打印逻辑:用自定义方法替代原直接打印数组的语句,实现统一格式输出。

预期输出示例

4130.28
3.60
11.79
[350.45, 436.39, 340.75, 442.19, 534.41, 19.89, 206.66, 492.44, 241.77, 382.61, 376.09, 306.63]
[368.07, 457.20, 359.18, 464.71, 561.10, 27.18, 221.28, 517.41, 256.49, 402.10, 394.80, 322.34]
[104.98, 131.35, 104.20, 138.68, 177.35, 9.00, 70.67, 166.94, 79.89, 122.42, 115.67, 91.95]
[3.39, 4.69, 3.36, 4.62, 5.72, 0.30, 2.28, 5.39, 2.66, 3.95, 3.86, 2.97]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:55:53