You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:33:20