如何在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()); } }
关键修改说明
- 泛型调整:将
Map<String, Map<String, BigDecimal>>改为Map<String, Map<String, Object>>,适配数组类型,避免强制转换错误。 - 新增格式化方法:
printFormattedArray负责遍历数组,逐个格式化元素并拼接成标准数组格式字符串。 - 替换打印逻辑:用自定义方法替代原直接打印数组的语句,实现统一格式输出。
预期输出示例
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
相关产品推荐
相关产品推荐

