Java代码报错修复求助:double转int精度丢失、boolean无法转int
编译错误修复方案
错误根源分析
你遇到的两个编译错误直接来自TestApplicants.java中调用customFilter方法时的参数错误:
- double转int的损失性转换错误:你在
int[]数组中传入了4.0、3.2这类double类型数值,Java不允许自动将带小数的浮点型转换为整型(会丢失精度)。 - boolean转int错误:你在
int[]数组中传入了true、false这类布尔值,布尔类型和整型之间没有自动转换规则。
你提到替换int为double未解决问题,是因为只修改了部分类型,没有匹配方法参数和调用逻辑的整体调整。
具体修复步骤
1. 修正Applicants.java的customFilter方法
调整方法参数类型以兼容多种数据类型,同时修复整数除法的精度丢失问题:
public class Applicants { // 保留原有代码(构造器、getter/setter、其他分析方法)不变,仅修改customFilter方法 public boolean customFilter(Object[] data){ int sum = 0; int count = 0; for (int i = 0; i < data.length; i++){ if (i < 6){ // 前6项为课程成绩,强制转换为int sum += (int) data[i]; } else if (i >=6 && data[i] instanceof Double){ // 第7项及以后为GPA(double类型),判断是否大于3.5 double gpa = (Double) data[i]; if (gpa > 3.5){ count++; } } } // 用6.0触发浮点除法,避免精度丢失 double average = sum / 6.0; return (average > 70 && count > 0); } }
2. 修正TestApplicants.java的customFilter调用
将传入的数组改为Object[],移除无意义的布尔值(原逻辑未使用布尔参数,属于误传):
public class TestApplicants { public static void main(String[] args){ Applicants applicant1 = new Applicants("John Doe", new int[]{90, 95, 80, 100, 75, 95}); System.out.println(applicant1.averageAbove85()); //true System.out.println(applicant1.noGradeBelow65()); //true System.out.println(applicant1.atleastFour85()); //false System.out.println(applicant1.upperLevelAbove85()); //true // 修改为Object数组,移除多余的true System.out.println(applicant1.customFilter(new Object[]{90, 95, 80, 100, 75, 95, 4.0, 3})); //true Applicants applicant2 = new Applicants("Jane Doe", new int[]{60, 70, 80, 85, 95, 100}); System.out.println(applicant2.averageAbove85()); //true System.out.println(applicant2.noGradeBelow65()); //false System.out.println(applicant2.atleastFour85()); //true System.out.println(applicant2.upperLevelAbove85()); //true // 修改为Object数组,移除多余的false System.out.println(applicant2.customFilter(new Object[]{60, 70, 80, 85, 95, 100, 3.2, 1})); //false } }
3. 额外修复:其他方法的整数除法精度问题
原代码中averageAbove85、upperLevelAbove85方法存在整数除法导致的精度丢失,比如总分435除以6门课,整数除法会得到72而非72.5,可能导致判断错误,建议同步修改:
// 修改averageAbove85方法中的平均计算 double average = sum / (double) academicData.length; // 修改upperLevelAbove85方法中的平均计算 double average = sum / 4.0;
修复后运行结果
修复后代码可正常编译运行,输出与你注释预期一致:
true true false true true true false true true false
内容的提问来源于stack exchange,提问作者Karzh
相关产品推荐
相关产品推荐

