
本文讲解如何正确实现一个 java 直方图程序:将输入的浮点数四舍五入为整数,并打印对应数量的星号(*),避免因截断取整导致逻辑失效,同时用循环替代冗余 if 判断提升可扩展性。
在 Java 中,直接使用 (int)doubleValue 并非“四舍五入”,而是向零截断(truncation)——即丢弃小数部分,不进行进位。例如:
System.out.println((int)13.5); // 输出 13(不是 14!) System.out.println((int)13.9); // 输出 13 System.out.println((int)-2.7); // 输出 -2(仍为向零截断)
因此,当你调用 obj.histogram(13.5) 时,roundNum 实际被赋值为 13,而你的所有 if 分支仅覆盖了 0、1、3、14、16 等特定值,自然不会输出任何内容。
✅ 正确做法是使用 Math.round() 进行真正的四舍五入(返回 long,需转为 int):
int roundNum = (int) Math.round(num);
更关键的是,应避免为每个可能数值硬编码 if 判断。直方图的核心逻辑是:*打印 n 个 `,其中n是四舍五入后的非负整数**。这完全可通过for` 循环简洁实现:
立即学习“Java免费学习笔记(深入)”;
public class Histogram {
public static void main(String[] args) {
Histogram obj = new Histogram(); // 类名首字母大写,符合 Java 命名规范
obj.histogram(13.5); // 输出 14 个 *
obj.histogram(2.3); // 输出 2 个 *
obj.histogram(-1.8); // 输出 2 个 *(Math.round(-1.8) == -2 → 绝对值?见下文说明)
}
}
class Histogram { // 类名应为 PascalCase
public void histogram(double num) {
int roundNum = (int) Math.round(num);
// 处理负数:直方图通常只表示数量,建议取绝对值或限制为非负
int barLength = Math.max(0, roundNum); // 确保星号数 ≥ 0
// 打印 barLength 个星号,后接原始数值(可选)
for (int i = 0; i < barLength; i++) {
System.out.print("*");
}
System.out.println(" (input: " + num + ")");
}
}? 注意事项与优化建议:
- 命名规范:Java 类名必须首字母大写(如 Histogram),变量/方法名用 camelCase;原代码中 histogram 类名小写,违反约定且易引发编译或维护问题。
- 负数处理:Math.round() 对负数也遵循四舍五入规则(如 Math.round(-1.5) == -1,Math.round(-1.6) == -2)。若直方图仅表示“频次”或“数量”,应确保 barLength ≥ 0,推荐使用 Math.max(0, roundNum)。
- 性能与可读性:循环方案时间复杂度为 O(n),但逻辑清晰、无硬编码、支持任意整数值,远优于数十个 if 的脆弱结构。
- 扩展提示:如需支持多组数据、不同字符、对齐显示或控制台宽度限制,可进一步封装为 printBar(int count, char symbol, int maxWidth) 等通用方法。
掌握 Math.round() 与循环驱动的动态输出,你就能构建真正健壮、可复用的直方图工具。










