
本文讲解如何正确实现一个 java 直方图程序:输入浮点数,先四舍五入为整数,再打印对应数量的星号(`*`),并指出原始代码中强制类型转换导致的逻辑错误及优化方案。
在 Java 中,直接将 double 强制转为 int(如 (int)13.5)并非四舍五入,而是截断小数部分,结果恒为向下取整(即 floor 行为)。因此 obj.histogram(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); // 换行并标注原始输入
}
}✅ 运行效果示例:
立即学习“Java免费学习笔记(深入)”;
************** ← 对应数值: 13.5 *** ← 对应数值: 2.7 ← 对应数值: 0.2
⚠️ 注意事项:
- 避免使用 (int)num 替代四舍五入;务必用 Math.round();
- 类名 histogram 应改为 Histogram(遵循 Java 驼峰命名规范,且需与文件名一致);
- 若输入可能为负数,建议显式校验并处理,防止无效直方图;
- 如需更高精度(如处理 double 边界值),可考虑 BigDecimal,但对一般直方图场景 Math.round() 已足够。
通过循环替代硬编码分支,代码变得简洁、可扩展、易测试——这才是直方图逻辑的正确打开方式。










