如何用 while 循环正确打印水平直方图(星号序列)

本文详解为何 `system.out.println()` 会导致星号垂直排列,并提供修正方案:改用 `system.out.print()` 配合逻辑优化,实现按输入数值整数部分打印水平排列的星号,同时避免冗余输出和逻辑错误。

在 Java 中,System.out.println() 的核心特性是每次调用后自动换行——这正是导致星号呈现“垂直列”而非“水平行”的根本原因。要绘制水平直方图(例如输入 3.2 应输出 ***),必须使用 System.out.print("*")(不换行)逐个输出星号,最后统一换行或追加其他内容。

但原代码存

在多重逻辑缺陷,需系统性修复:

? 关键问题分析

  • 错误的取整逻辑:num % 10 并非获取整数部分,而是取模运算(如 13.5 % 10 = 3.5),无法可靠提取有效位数;
  • 冗余条件分支:两个 if 块均执行 println("* " + num),实际等价于无条件重复打印,且 num 被重复输出多次;
  • 循环边界错误:while (i
  • 未处理小数舍入规则:题目要求“3.2 → 3 个星号”,即应取向下取整(floor),而非依赖小数位判断是否 ≥5(该逻辑与题意无关,疑似混淆了四舍五入)。

✅ 正确实现方案

目标:输入 double num,打印 floor(num) 个 *,水平排列,末尾可选附加空格与原数值(如 "*** 3.2")。

public void histogram(double num) {
    // 步骤1:安全取整——获取非负整数部分(向下取整)
    int count = (int) Math.floor(Math.max(0, num));

    // 步骤2:水平打印 count 个星号(不换行)
    int i = 0;
    while (i < count) {
        System.out.print("*");
        i++;
    }

    // 步骤3:附加空格和原始数值(可选),最后换行确保格式整洁
    System.out.println(" " + num);
}

⚠️ 注意事项

  • Math.floor() 确保 3.9 → 3、0.7 → 0、-1.2 → -2;若需非负计数,务必用 Math.max(0, num) 保护;
  • 循环条件应为 i
  • System.out.print() 用于连续输出,System.out.println() 仅在最终需要换行时调用;
  • 原答案中拆分两个 while 循环并依赖 getsecondNum 判断 >=5 是严重偏离需求的——题目从未要求根据小数部分决定星号数量,该逻辑既无效又易引发 0.49 等边界错误。

✅ 测试验证

输入 输出 说明
3.2 *** 3.2 正确打印 3 个星号
0 0.0 count=0,仅输出空格+数值
5.99 ***** 5.99 向下取整得 5

遵循此方案,即可稳定生成水平直方图,彻底解决垂直排列问题,并确保逻辑清晰、健壮可维护。