如何用 Java 动态生成直方图(星号数量匹配四舍五入后的整数值)

本文讲解如何正确实现一个 java 直方图程序:输入浮点数,先四舍五入为整数,再打印对应数量的星号(`*`),并指出原始代码中强制类型转换导致的逻辑错误及优化方案。

在 Java 中,直接将 double 强制转为 int(如 (int)13.5)并非四舍五入,而是截断小数部分,结果恒为向下取整(即 floor 行为)。因此 obj.hi

stogram(13.5) 中 roundNum 实际得到的是 13,而原代码中所有 if 分支仅覆盖了 0、1、3、14、16 等特定值,未包含 13,故无任何输出——这是程序“静默失败”的根本原因。

要真正实现“四舍五入”,应使用 Math.round() 方法:

int roundNum = (int) Math.round(num); // 正确四舍五入:13.5 → 14, 13.4 → 13

更关键的是,硬编码多个 if 判断不仅难以维护,还完全违背直方图的核心逻辑:星号数量应严格等于四舍五入后的整数值(非负时)。推荐使用 for 循环动态生成星号:

public class Histogram {
    public static void main(String[] args) {
        Histogram obj = new Histogram(); // 类名首字母大写,符合 Java 命名规范
        obj.histogram(13.5); // 输出 14 个 *
        obj.histogram(2.7);  // 输出 3 个 *
        obj.histogram(0.2);  // 输出 0 个 *(空行)
    }
}

class Histogram { // 类名应与文件名一致,且首字母大写
    public void histogram(double num) {
        int roundNum = (int) Math.round(num);

        // 处理负数情况(直方图通常不支持负频次,可选择忽略或报错)
        if (roundNum < 0) {
            System.out.println("警告:输入值 " + num + " 四舍五入后为负数,跳过绘制。");
            return;
        }

        // 动态打印 roundNum 个星号
        for (int i = 0; i < roundNum; i++) {
            System.out.print("*");
        }
        System.out.println("  ← 对应数值: " + num); // 换行并标注原始输入
    }
}

运行效果示例:

**************  ← 对应数值: 13.5  
***  ← 对应数值: 2.7  
  ← 对应数值: 0.2  

⚠️ 注意事项:

  • 避免使用 (int)num 替代四舍五入;务必用 Math.round();
  • 类名 histogram 应改为 Histogram(遵循 Java 驼峰命名规范,且需与文件名一致);
  • 若输入可能为负数,建议显式校验并处理,防止无效直方图;
  • 如需更高精度(如处理 double 边界值),可考虑 BigDecimal,但对一般直方图场景 Math.round() 已足够。

通过循环替代硬编码分支,代码变得简洁、可扩展、易测试——这才是直方图逻辑的正确打开方式。