Java如何修改代码支持double类型 避免除法运算返回0值
问题描述
现有代码预期功能为随机生成两个整数,展示给用户后由用户完成两数的除法计算。存在两个核心问题:
- 直接将
answer、response变量修改为double类型时代码无法正常运行 - 现有代码使用整数除法逻辑,计算1/5这类题目时会因整数截断特性返回结果0,计算5/4这类题目时返回结果1,无法得到正确的浮点除法结果
需要调整代码使其支持double类型运算,避免除法返回错误的截断值。
原问题代码如下:
//Variables String name; String probType; String longProbType; int numProb; int loFactor; int hiFactor; int factor1; int factor2; int answer; int response; int score; double scorePct; case "D": for(int i = 0; i < numProb; i++) { factor1 = random.nextInt(hiFactor - loFactor + 1) + loFactor; factor2 = random.nextInt(hiFactor - loFactor + 1) + loFactor; if(factor2 == 0) { factor2 += 1; } System.out.print(String.format("\n%d / %d = ", factor1, factor2)); response = input.nextInt(); input.nextLine(); answer = factor1 / factor2; if(answer == response) { score += 1; System.out.println("Correct!"); history[i] = String.format("%d / %d = %d, Correct, correct answer is %d", factor1, factor2, response, answer); } else { System.out.println(String.format("Incorrect! Correct answer is %d", answer)); history[i] = String.format("%d / %d = %d, Incorrect, correct answer is %d", factor1, factor2, response, answer); } } System.out.println("\nSession Summary"); System.out.println(String.format("%d problems, %d correct", numProb, score)); scorePct = ((double)score / numProb) * 100; System.out.println(String.format("Score is %.1f\n", scorePct)); System.out.println("\nProblems"); for(int i = 0; i < numProb; i++) { System.out.println(history[i]); } System.out.println(outromessage); break;
故障原因
- Java中两个int类型值直接做除法时,会默认执行整数截断运算,直接丢弃小数部分,不会自动转为浮点运算
- 直接修改
answer、response为double时未同步修改输入读取方法、字符串格式化占位符,会触发类型不匹配错误 - 浮点数存在存储精度误差,直接用
==判断用户输入和标准答案是否相等,会出现数值实际一致却判定为错误的问题
修复步骤
- 修改变量声明:将
answer、response的类型从int改为double - 修正除法运算逻辑:计算答案时将其中一个运算数强转为double,强制触发浮点除法,避免整数截断
- 修正输入读取逻辑:将读取用户输入的
input.nextInt()改为input.nextDouble(),匹配double类型输入 - 修正相等判断逻辑:不直接用
==比较两个double值,改为判断两者差值的绝对值小于1e-6(即0.000001),规避浮点数精度误差 - 修正字符串格式化占位符:将所有对应
answer、response的整数占位符%d改为浮点数占位符%.2f(保留2位小数,可根据需求调整小数位数)
修复后完整代码
//Variables String name; String probType; String longProbType; int numProb; int loFactor; int hiFactor; int factor1; int factor2; // 改为double类型存储答案和用户输入 double answer; double response; int score; double scorePct; case "D": for(int i = 0; i < numProb; i++) { factor1 = random.nextInt(hiFactor - loFactor + 1) + loFactor; factor2 = random.nextInt(hiFactor - loFactor + 1) + loFactor; if(factor2 == 0) { factor2 += 1; } System.out.print(String.format("\n%d / %d = (结果可保留2位小数) ", factor1, factor2)); // 读取double类型输入 response = input.nextDouble(); input.nextLine(); // 强转其中一个运算数为double,触发浮点除法 answer = (double) factor1 / factor2; // 用差值阈值判断相等,规避浮点数精度问题 if(Math.abs(answer - response) < 1e-6) { score += 1; System.out.println("Correct!"); history[i] = String.format("%d / %d = %.2f, Correct, correct answer is %.2f", factor1, factor2, response, answer); } else { System.out.println(String.format("Incorrect! Correct answer is %.2f", answer)); history[i] = String.format("%d / %d = %.2f, Incorrect, correct answer is %.2f", factor1, factor2, response, answer); } } System.out.println("\nSession Summary"); System.out.println(String.format("%d problems, %d correct", numProb, score)); scorePct = ((double)score / numProb) * 100; System.out.println(String.format("Score is %.1f\n", scorePct)); System.out.println("\nProblems"); for(int i = 0; i < numProb; i++) { System.out.println(history[i]); } System.out.println(outromessage); break;
注:如果需要固定小数位数的判等逻辑,比如要求用户输入结果保留2位小数,可以在计算标准答案时也做对应精度截断,再做差值比较即可。
内容的提问来源于stack exchange,提问作者Naruaharu
相关产品推荐
相关产品推荐

